在 Swift 中,包裹条件和循环变量的括号可以省略,举个栗子:
let individualScores = [75, 43, 103, 87, 12] var teamScore = 0 for score in individualScores { // 循环语句的小括号可以省略 if score > 50 { // 条件语句的小括号可以省略 teamScore += 3 } else { teamScore += 1 } } // 循环语句体的大括号不能省略 print(teamScore)
在 if 语句中,条件必须是一个布尔表达式。什么意思呢?比如以前我们常用 if (a) 来代替 if (a != 0),但是在 Swift 里 if (a) 就会报错,必须写成 if (a != 0)
在 Swift 中有可选值。可选值可能是一个具体的值,也有可能是 nil。在类型后面加一个问号来标记这个变量的值是可选的,比如:
var optionalString: String? = "Hello" print(optionalString == nil) // 输出结果为 false
可以用 if 和 let 来处理可选值:
var optionalName: String? = "John" var greeting = "Hello!" if let name = optionalName { greeting = "Hello, \(name)" }
当 optionalName 不是 nil 时会将值赋给 name,当 optionalName 是 nil 时,条件会判断为 false,大括号中的代码会被跳过。
但是为什么当 optionalName 是 nil 时条件会判断为 false 呢?我想是因为 Swift 中不能直接用 nil 赋值:
这样写可以:
let a : Int? = nil
let nickName: String? = nil let fullName = "John" let informalGreeting = "Hello \(nickName ?? fullName)" // 输出结果为 Hello John当 nickName 为 nil 时,就会使用默认值 fullName。
switch 是 Swift 中的一大亮点。在 Swift 里 switch 语句支持任意类型的数据以及各种比较操作!
let name = "some object" switch name { case "lala": print("111111") case "okok", "123": print("222222") case let x where x.hasSuffix("object"): print("Is it \(x)?") default: print("333333") }最终输出结果为 Is it some object?
注意 let x where x.hasSuffix("object") 一句的用法,非常的灵活。感觉有点像 sql 语句。
在 Swift 中每个 case 后都不用写大括号,而且某个 case 匹配成功的话就不会继续往下执行,所以也不需要写 break。
可以用 for-in 来遍历字典,用两个变量来表示每个键值对(如下面的 kind 和 numbers)。别忘了字典是无序的~
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 // 记录最大的数值 var largestKind = String() // 记录最大数的类型 for (kind, numbers) in interestingNumbers { for number in numbers { if number > largest { largest = number largestKind = kind } } } print(largest, largestKind) // 输出结果为 25 Square现在我们有一个字典,字典里有三种不同类型的数,我们要找出其中最大的数,以及这个数的类型。最后我们找到最大的数是 25,它是一个平方数。
while 和其它语言一样,在 Swift 中有 repeat 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)