Swift提供了所有大家熟悉的控制流文法,其中包含多重循環的while和for循環;根據一定條件執行不同分支的if、guard和switch文法;以及控制流程轉移的break和continue。
除此之外,Swift在for循環的基礎上,增加了for-in循環。for-in循環可以快速幫你提取數組内的元素,同樣支援字典、字元串以及其他集合。
swift的switch文法是非常強大的。它使得流程更加清晰化,讓我想到了強大的AOP架構。在swith中的每個case,你不需要使用break傳回,它是自動執行break操作的,不會執行下一個case内的代碼。同時switch還支援其他強大的功能,如間隔比對、元祖比對、區域比對、臨時綁定常量比對以及比對時使用where做增加比對。
For循環
Swift中的for循環提供了兩種常用的模式,for-in和for
- for-in在周遊的過程中,能幫你快速提取元組中的對象;
- for和其他開發語言的for一樣,中間三個條件,用“;”分割。
For-In
// MARK: for-in循環
private func testForIn() {
// 直接循環提取内部資料
// [1,5]
for index in . {
print("\(index) times 5 is \(index * 5)")
}
// 不需要提取資料,隻需要循環次數
let base =
let power =
var answer =
for _ in ..power {
answer *= base
}
print("\(base) to the power of \(power) is \(answer)")
// array周遊
let array = ["陽君", "937447974"]
for item in array {
print("array:\(item)!")
}
// Dictionary周遊
let dict = ["name":"陽君", "qq":"937447974"]
for (key, value) in dict {
print("key:\(key);value:\(value)")
}
}
For
For的一般結構如下所示:
例子代碼如下:
// MARK: - 傳統for循環
private func testFor() {
for var index = ; index < ; index++ {
print("index is \(index)")
}
}
While循環
While循環執行其内部的代碼,直到條件為假。wihile提供了兩種循環模式:
- while是先執行條件判斷後執行内部代碼;
- repeat-while是先執行内部代碼後執行條件判斷。
While
結構圖:
// MARK: - While循環
private func testWhile() {
// 先執行while條件判斷,後執行内部代碼
let count =
var index =
while index < count {
index++
print("while:\(index)")
}
}
Repeat-While
結構圖:
// MARK: repeat-while循環
private func testRepeatWhile() {
// 執行内部代碼後判斷條件
let count =
var index =
repeat {
index++
print("RepeatWhile:\(index)")
} while index < count
}
條件分支
條件分支主要用于在特定的條件執行不同的代碼。當一個情況發生時,你可能想運作額外的代碼,要做到這一點你就需要使用條件分支。
當你想在代碼中使用條件分支時,Swift提供了兩種文法if和switch。通常情況下你可以使用if來做普通的條件判斷,當你的應用場景複雜化時可以是switch來代碼分支。
If
if後跟的條件為真時,執行括号内的代碼,否則跳過。
// MARK: if 判斷
private func testIf() {
// 一個條件一個條件的判斷,當條件為真時,執行内部程式
let temp =
if temp <= {
// 不執行
} else if temp >= {
print("執行")
} else {
// 不執行
}
}
Switch
Switch使用一個值去case比對幾種可能,當比對成功時,執行其内部代碼。結構圖:
// MARK: swich判斷
private func testSwitch() {
// 基本switch,case不會穿透。
let someCharacter: Character = "a"
switch someCharacter {
case "a":
print("1")
case "a", "b", "c":
print("2") //這裡不會輸出,case找到後,執行完畢就傳回
default:
print("未找到")
}
}
範圍比對
如同刻度尺,switch可以幫助你快速讓一個點落到一個刻度尺範圍内。它還可以幫你落到一個時間間隔内。
private func testSwitchIntervalMatching() {
// 範圍選擇
let approximateCount =
switch approximateCount {
case .<:
print("[1, 5)")
case .<:
print("[5, 10)")
default:
print("未找到")
}
}
元組
在switch中你還可以使用元組比對,如坐标點(1,1)。如果你隻想比對y,不關心x的值,你可以使用
(_)
,也就是比對
(1,_)
。
// MARK: switch元組選擇
private func testSwitchTuples() {
// 元組選擇,坐标軸測試
let random = arc4random()// 随機數
let somePoint = (Int(random%3), Int(random%3))// 随機數擷取點
switch somePoint {
case (, ):
print("(0, 0) is at the origin")
case (_, ):
print("(\(somePoint.0), 0) is on the x-axis")
case (, _):
print("(0, \(somePoint.1)) is on the y-axis")
case (-., -.):
print("(\(somePoint.0), \(somePoint.1)) is inside the box")
default:
print("(\(somePoint.0), \(somePoint.1)) is outside of the box")
}
}
值綁定
當你使用元組比對,而不關心比對時的某個值,但你想拿到比對成功的值,就可以使用值綁定,并用let聲明的屬性去獲得這個值。
// MARK: switch值選擇
private func testSwitchValueBindings() {
let random = arc4random()// 随機數
// 值綁定,如果設定未知數,當比對成功時,執行此代碼
let anotherPoint = (Int(random%), Int(random%))
switch anotherPoint {
case (let x, ):
print("\(x),x比對")
case (, let y):
print("\(y),y比對")
case let (x, y):
print("(\(x), \(y)),其他")
}
}
值綁定和Where
在值綁定時,我們可以用where給未知數設定條件,當符合這個條件并且值綁定成功後才會執行内部語句。
// MARK: switch值綁定和where
private func testSwitchValueBindingsWhere() {
// 使用where條件二次判斷
let random = arc4random()// 随機數
let yetAnotherPoint = (Int(random%), Int(random%))
switch yetAnotherPoint {
case let (x, y) where x < y:
print("\(x) < \(y)")
case let (x, y) where x > y:
print("\(x) > \(y)")
case let (x, y):
print("\(x) = \(y)")
}
}
控制轉移
控制轉移可以幫助你改變代碼執行的順序。在swift中,控制轉移有5種文法:
- continue
- break
- fallthrough
- return
- throw
Continue
跳過目前循環,并繼續執行下一次循環。
// MARK: continue
private func testContinue() {
// 跳過本次循環,繼續執行下次循環
for index in . {
if index == {
continue
}
print("continue:\(index)")
}
}
Break
Break主要在for循環和switch中使用。在for循環中就是停止for循環,繼續執行for循環體後的代碼;在switch中,break以為着switch代碼塊執行結束,繼續執行switch代碼塊後的代碼。
// MARK: break
private func testBreak() {
// 跳過目前for或者switch,繼續執行
for x in . {
if x == {
break
}
print("break-x:\(x)")
}
print("break-for")
let z =
switch z {
case :
break;
default:
break;
}
print("break-switch")
}
Fallthrough
在swift中switch的case内的代碼執行完畢後,預設執行break操作,這就意味着,你無法同時執行兩個case内的代碼。當你執行完畢一個case内的代碼後,還想執行下一個case内的代碼,就需要使用fallthrough(擊穿)。
// MARK: fallthrough
private func testFallthrough() {
// 擊穿:執行目前case内的代碼,并執行下一個case内的代碼
let x = Int(arc4random())// 0
switch x {
case:
print("0")
fallthrough
case :
print("1")
fallthrough
default:
break;
}
}
标簽
在swift中,使用标簽聲明的代碼塊,在其内部你可以快速使用break停止這個标簽體,或使用continue重新執行這個标簽内的代碼。
// MARK: 标簽
private func testLabeledStatements() {
// 标簽語句,可以直接跳到寫标簽行的代碼
var b = false
go : while true {
print("go")
switch b {
case true:
print("true")
break go // 跳過go标簽的代碼
case false:
print("false")
b = true
continue go // 繼續執行go标簽的代碼
}
}
}
提前退出
Guard文法和if很類似,在if中,當條件為true時執行其内部代碼。guard和else合用,與if的差異性在于當條件為true跳過内部代碼;條件為false時執行内部代碼。
// MARK: - 提前退出
private func testEarlyExit() {
// guard和if很像,當條件判斷為假時,才執行else中的代碼
func greet(person: [String: String]) {
guard let name = person["name"] else {
print("無name")
return
}
print("name: \(name)!")
}
greet([:])
greet(["name": "陽君"])
}
檢查API可用性
當你在swift中使用IOS9新增加的代碼,而使用者的手機使用的系統是IOS8時。程式運作到此處app會閃退,這是很不好的使用者體驗。swift根據這種情況,增加了使用者版本判斷工具#available()。
// MARK: - 檢查API可用性
private func testCheckingAPIAvailability() {
if #available(iOS 9.1, OSX 10.10, *) {
print("iOS 9.1, OSX 10.10, *")
} else {
print("低版本")
}
}
其他
參考資料
The Swift Programming Language (Swift 2.1)
文檔修改記錄
時間 | 描述 |
---|---|
2015-10-26 | 根據 The Swift Programming Language (Swift 2.1)總結 |
版權所有:http://blog.csdn.net/y550918116j