在 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)