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