设置常数使用let,设置变量使用var
var myVariable = 42 myVariable = 50 let myConstant = 42
编译器可以自己推断出变量类型因此不用显式限定。
如果没有赋初值或信息不足以让编译器判断,则可以通过冒号显式声明:
let implicitInteger = 70 let implicitDouble = 70.0 let explicitDouble: Double = 70
任何变量类型都不可以隐式转换,所有变量之间的转换都为显式:
let label = "The width is " let width = 94 let widthLabel = label + String(width)
对于String的转换,有一种更简单的方法:
let apples = 3 let oranges = 5 let appleSummary = "I have (apples) apples." let fruitSummary = "I have (apples + oranges) pieces of fruit."
Dictionary和List:
var shoppingList = ["catfish", "water", "tulips", "blue paint"] shoppingList[1] = "bottle of water" var occupations = [ "Malcolm": "Captain", "Kaylee": "Mechanic", ] occupations["Jayne"] = "Public Relations"
初始化:
let emptyArray = [String]()
let emptyDictionary = [String: Float]()
如果类型相对固定,可以使用[]或[:]创建空的list和dictionary:
shoppingList = []
occupations = [:]
for if语句:
let individualScores = [75, 43, 103, 87, 12] var teamScore = 0 for score in individualScores { if score > 50 { teamScore += 3 } else { teamScore += 1 } } print(teamScore)
需要注意,由于没有隐式转换,所以直接用数字当比较条件会报错。
但是在optional变量时,可以使用let和if一起判断是否optional变量存在
var optionalString: String? = "Hello" print(optionalString == nil) var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = optionalName { greeting = "Hello, (name)" }
对于optional变量,还可以通过??赋予默认值:
let nickName: String? = nil let fullName: String = "John Appleseed" let informalGreeting = "Hi (nickName ?? fullName)"
let还可以用于对变量进行匹配:
let vegetable = "red pepper" switch vegetable { case "celery": print("Add some raisins and make ants on a log.") case "cucumber", "watercress": print("That would make a good tea sandwich.") case let x where x.hasSuffix("pepper"): print("Is it a spicy (x)?") default: print("Everything tastes good in soup.") }
swift中的switch语句自动break。
当使用for-in遍历dictionary的时候,key-value对是无序的:
let interestingNumbers = [ "Prime": [2, 3, 5, 7, 11, 13], "Fibonacci": [1, 1, 2, 3, 5, 8], "Square": [1, 4, 9, 16, 25], ] var largest = 0 for (kind, numbers) in interestingNumbers { for number in numbers { if number > largest { largest = number } } } print(largest)
while和do-while
var n = 2 while n < 100 { n = n * 2 } print(n) var m = 2 repeat { m = m * 2 } while m < 100 print(m)
循环时还可以使用..<进行range循环:
var total = 0 for i in 0..<4 { total += i } print(total)
使用func声明函数,通过->将形参和返回值分开:
func greet(name: String, day: String) -> String { return "Hello (name), today is (day)." } greet("Bob", day: "Tuesday")
函数还可以传入list,返回tuple:
func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) { var min = scores[0] var max = scores[0] var sum = 0 for score in scores { if score > max { max = score } else if score < min { min = score } sum += score } return (min, max, sum) } let statistics = calculateStatistics([5, 3, 100, 3, 9]) print(statistics.sum) print(statistics.2)
同时形参还可以不定:
func sumOf(numbers: Int...) -> Int { var sum = 0 for number in numbers { sum += number } return sum } sumOf() sumOf(42, 597, 12)
函数还可以嵌套声明:
func sumOf(numbers: Int...) -> Int { var sum = 0 for number in numbers { sum += number } return sum } sumOf() sumOf(42, 597, 12)
函数还可以作为参数进行传递:
func makeIncrementer() -> ((Int) -> Int) { func addOne(number: Int) -> Int { return 1 + number } return addOne } var increment = makeIncrementer() increment(7)
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool { for item in list { if condition(item) { return true } } return false } func lessThanTen(number: Int) -> Bool { return number < 10 } var numbers = [20, 19, 7, 12] hasAnyMatches(numbers, condition: lessThanTen)
类声明和对象声明:
class Shape { var numberOfSides = 0 func simpleDescription() -> String { return "A shape with (numberOfSides) sides." } } var shape = Shape() shape.numberOfSides = 7 var shapeDescription = shape.simpleDescription()
构造函数:
class NamedShape { var numberOfSides: Int = 0 var name: String init(name: String) { self.name = name } func simpleDescription() -> String { return "A shape with (numberOfSides) sides." } }
析构函数为deinit
继承时,override的方法需要显式声明:
class Square: NamedShape { var sideLength: Double init(sideLength: Double, name: String) { self.sideLength = sideLength super.init(name: name) numberOfSides = 4 } func area() -> Double { return sideLength * sideLength } override func simpleDescription() -> String { return "A square with sides of length (sideLength)." } } let test = Square(sideLength: 5.2, name: "my test square") test.area() test.simpleDescription()
Setter和Getter
class EquilateralTriangle: NamedShape { var sideLength: Double = 0.0 init(sideLength: Double, name: String) { self.sideLength = sideLength super.init(name: name) numberOfSides = 3 } var perimeter: Double { get { return 3.0 * sideLength } set { sideLength = newValue / 3.0 } } override func simpleDescription() -> String { return "An equilateral triangle with sides of length (sideLength)." } } var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle") print(triangle.perimeter) triangle.perimeter = 9.9 print(triangle.sideLength)
在这里setter传参隐式声明为newValue,可以在set后面括号前面声明自定义的变量名。
如果需要在set之前或之后进行预定义操作,可以使用willSet和didSet:
class TriangleAndSquare { var triangle: EquilateralTriangle { willSet { square.sideLength = newValue.sideLength } } var square: Square { willSet { triangle.sideLength = newValue.sideLength } } init(size: Double, name: String) { square = Square(sideLength: size, name: name) triangle = EquilateralTriangle(sideLength: size, name: name) } } var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape") print(triangleAndSquare.square.sideLength) print(triangleAndSquare.triangle.sideLength) triangleAndSquare.square = Square(sideLength: 50, name: "larger square") print(triangleAndSquare.triangle.sideLength)
在对optional变量操作时,如果optional变量为nil,则?之后的语句全部不执行,整条语句为nil。
let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square") let sideLength = optionalSquare?.sideLength
structure和class的不同在于,structure通过复制的方式传参,而class通过引用。