一、for循環(huán)
-
for-in
循環(huán),遍歷集合里面的每個(gè)元素:
// 遍歷的元素是1到3的數(shù)字
for index in 1...3 { // index是每次循環(huán)開始時(shí)自動(dòng)賦值,而且也不用聲明
print(index);
}
輸出結(jié)果: 1 2 3
當(dāng)不需要區(qū)間序列內(nèi)的值,可以用_
來忽略對(duì)值的訪問:
int sum = 0;
for _ in 1...3 {
sum += 1;
print(sum);
}
輸出結(jié)果: 3
遍歷一個(gè)數(shù)組的所有元素:
let names = ["張三","李四","王五"];
for name in names {
print(name);
}
輸出結(jié)果:
張三
李四
王五
遍歷一個(gè)字典來訪問它的鍵值對(duì)。遍歷時(shí),字典每項(xiàng)元素會(huì)以(key,value)
元組形式返回:
let dict = ["name":"swift", "age":"2", "version":"3.0"];
for (key,value) in dict {
print("\\\\(key):\\\\(value)");
}
輸出結(jié)果:
version:3.0
age:2
name:swift
(備注:字典遍歷順序和插入順序不同,是因?yàn)樽值鋬?nèi)部是無序的)
-
for
循環(huán),使用條件判斷和遞增方法,標(biāo)準(zhǔn)C樣式for
循環(huán):
// 這之后index++將會(huì)被swift移除,所以循環(huán)更多選擇for-in
for var index=0; index<3; index++ {
print("index:\\\\(index)");
}
輸出結(jié)果:
index:0
index:1
index:2
<br />
二、while循環(huán)
-
while
循環(huán),每次在循環(huán)開始時(shí),進(jìn)行條件判斷是否符合:
var index = 3;
while index > 0 { // 先判斷再執(zhí)行
index -= 1;
print(index);
}
輸出結(jié)果: 2 1 0
-
repeat-while
循環(huán),每次在循環(huán)結(jié)束時(shí),進(jìn)行條件判斷是否符合:
``` swift`
var index = 3;
repeat {
index -= 1;
print(index);
} while index > 0; // 先執(zhí)行,再進(jìn)行判斷
輸出結(jié)果: 2 1 0
<br />
#三、條件語句
---
?swift提供了兩種條件語句:`if`和`switch`。一般,但條件較為簡單且可能的情況較少時(shí),使用`if`語句。而`switch`更適合用于條件較復(fù)雜、可能情況較多、需要用到匹配`(pattern-matching)`的情況。
- `if`語句,當(dāng)且僅當(dāng)條件為`true`時(shí),才執(zhí)行相關(guān)代碼:
```swfit`
let age = 23;
if age >= 18 { // 符合條件
print("已成年...");
} else { // 否則,即不符合條件
print("未成年的小屁孩...");
}
輸出結(jié)果: 已成年...
-
switch
語句會(huì)嘗試把某個(gè)值與若干個(gè)模式(pattern
)進(jìn)行匹配,匹配成功則執(zhí)行對(duì)應(yīng)的代碼:
let someCharacter: Character = "e"
switch someCharacter {
case "a", "e", "i", "o", "u":
print("\\\\(someCharacter)是元音”);
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
print("\\\\(someCharacter)是輔音”);
default: // 默認(rèn)分支,處理其他情況的
print("\\\\(someCharacter)即不是元音也不是輔音”);
}
輸出結(jié)果: "e是元音”
(注:在swift中,case
分支最后break
不是必須的。當(dāng)匹配的case
分支中代碼執(zhí)行完畢后,程序會(huì)終止switch
語句,即不會(huì)繼續(xù)執(zhí)行下一個(gè)case
分支。)
-
switch
的區(qū)間模式。case
分支的模式可以是一個(gè)值區(qū)間:
``` swfit`
let num = 999;
switch num {
case 0...9:
print("一位數(shù)");
case 10..<100:
print("兩位數(shù)");
case 100..<1000:
print("三位數(shù)");
case 1000...9999:
print("四位數(shù)");
default :
print("其他");
}
// 輸出結(jié)果: 三位數(shù)
- `switch`的元組模式。`case`分支的模式可以是元組,元組中的元素可以是值,也可以是區(qū)間,另外,使用下劃線`_`可以匹配所有可能的值:
``` swfit`
// 以0,0為中心點(diǎn),4*4的矩形,確定點(diǎn)的位置
let point = (0,1);
switch point {
case (0, 0):
print("坐標(biāo)原點(diǎn)");
case (_, 0): // _ 匹配所有可能值
print("在x軸上");
case (0, _):
print("在y軸上");
case (-2...2, -2...2):
print("在矩形內(nèi)");
default:
print("在矩形外");
}
// 輸出結(jié)果: 在y軸上
點(diǎn)是否在矩形內(nèi)
-
switch
的值綁定Value Bindings
模式。case
分支的模式允許將匹配的值綁定到一個(gè)臨時(shí)的常量或變量,而這常量或變量在該case
分支中就可以被引用---這種行為就成為值綁定(Value Bindings)。
// 判斷點(diǎn)是否在x/y軸中
let point = (3,3);
switch point {
case (let x, 0):
print("在x軸上: \\\\(x)"); // 綁定后,在這里即可以進(jìn)行使用
case (0, let y):
print("在y軸上: \\\\(y)");
case let(x, y):
print("具體坐標(biāo): (\\\\(x),\\\\(y))");
}
輸出結(jié)果: 具體坐標(biāo):3,3
點(diǎn)是否在x/y軸中
-
switch
的where
模式。case
分支的模式可以使用where
來判斷額外條件:
// 判斷點(diǎn)是否在坐標(biāo)系的對(duì)角線上
let point = (-3,3);
switch point {
case let(x, y) where x == y:
print("在x==y對(duì)角線上");
case let(x,y) where x == -y:
print("在x==-y對(duì)角線上");
case let(x, y):
print("具體坐標(biāo): (\\\\(x),\\\\(y))");
}
輸出結(jié)果: 在x==-y對(duì)角線上
點(diǎn)是否在坐標(biāo)系的對(duì)角線上
<br />
四、控制轉(zhuǎn)移語句
控制轉(zhuǎn)移語句,是改變代碼的執(zhí)行順序,通過它可以實(shí)現(xiàn)代碼的跳轉(zhuǎn)。
-
continue
即循環(huán)體立即停止本次循環(huán),重新開始下一次循環(huán),但并不是離開整個(gè)循環(huán)體:
for index in 1...5 {
if index == 3 { // index為3的時(shí)候,停止本次循環(huán),重新下一次循環(huán)
continue;
}
print(index);
}
輸出結(jié)果: 1 2 4 5
-
break
語句會(huì)立即結(jié)束循環(huán)體:
for index in 1...5 {
if index == 3 { // index為3的時(shí)候,即退出for-in
break;
}
print(index);
}
輸出結(jié)果: 1 2
-
fallthrough
貫穿語句。在swift中switch
不會(huì)從上一個(gè)case
分支執(zhí)行到下一個(gè)case
分支中。而在C語言中,在每個(gè)case
分支之后,需要加上break
語句來阻止自動(dòng)執(zhí)行到下一個(gè)case
分支中。如果你需要C語言中的貫穿特性,每個(gè)需要該特性的case
分支中加入fallthrough
關(guān)鍵字:
let index = 3;
switch index {
case 1:
print("早上好");
case 2:
print("中午好");
case 3:
print("下午好");
fallthrough; // 表需要貫穿特性
case 4:
print("晚上好");
fallthrough; // 表需要貫穿特性
default:
print("洗洗睡");
}
輸出結(jié)果:
下午好
晚上好
洗洗睡
注意:
fallthrough
關(guān)鍵字不會(huì)檢查它下一個(gè)將會(huì)執(zhí)行case
中的匹配條件。fallthrough
簡單地使代碼執(zhí)行繼續(xù)連接到下一個(gè)case
中的執(zhí)行代碼,這就和C語言的switch
語句特性一樣的。
- 帶標(biāo)簽的語句。
switch
代碼中是可以嵌套循環(huán)體和switch
來創(chuàng)建復(fù)雜的控制流結(jié)構(gòu)。但循環(huán)體和switch
代碼塊兩者都可以使用break
語句來提前結(jié)束整個(gè)方法體。因此要明確指定break
語句想要終止的是哪個(gè)循環(huán)體或哪個(gè)switch
代碼塊。關(guān)鍵字continue
也一樣可以指定。
// while循環(huán),并指定這個(gè)標(biāo)簽為loop1
loop1:while index < 3 {
index += 1;
loop2:for temp in 1...3 {
// 當(dāng)index為2時(shí)候結(jié)束loop2循環(huán)
if index == 2 {
print("下一次再見,swift\\\\(index)-\\\\(temp)");
break loop2;
}
// 當(dāng)index為3的時(shí)候,最外層loop1循環(huán)將結(jié)束
if index == 3 {
print("不再見...");
break loop1;
}
print("swift\\\\(index)-\\\\(temp)前來報(bào)到...");
}
}
輸出結(jié)果:
swift1-1前來報(bào)到...
swift1-2前來報(bào)到...
swift1-3前來報(bào)到...
下一次再見,swift2-1
不再見...
(備注: return
函數(shù)的返回值,throw
錯(cuò)誤/異常的拋出)
<br />
五、退出操作
-
guard
語句類似于if
語句,執(zhí)行取決于與表達(dá)式的布爾值(在自定義異常的時(shí)候使用到)。可以使用guard
語句來要求條件必須是真時(shí),以執(zhí)行guard
語句后的代碼。不同于if
語句,一個(gè)guard
語句總是有一個(gè)else分句,如果天劍不為真則執(zhí)行else
分句中的代碼:
func greet(person: [String: String]) {
// 判斷關(guān)鍵字name對(duì)應(yīng)是否有值
guard let name = person["name"] else {
return; // 如果沒有值,那么就直接退出
}
print("Hello \\\\(name)");
// 關(guān)鍵字location對(duì)應(yīng)是否有值
guard let location = person["location"] else {
print("你在哪里?")
return
}
print("我正在購買到\\\\(location)的機(jī)票")
}
greet(["name": "Swift"]);
輸出結(jié)果: Hello Swift 你在哪里?
greet(["name": "Swift", "location": "美國"]);
輸出結(jié)果: Hello Swift 我正在購買到美國的機(jī)票
<br />
六、檢測(cè)API可用性
- swift有檢查API可用性的內(nèi)置支持,這可以確保我們不會(huì)不小心地使用對(duì)于當(dāng)前部署目標(biāo)不可用的API,從而導(dǎo)致程序在編譯期間報(bào)錯(cuò):
/**
參數(shù)1:在iOS系統(tǒng)上,只有iOS 9及更高版本中執(zhí)行;
參數(shù)2:在OS X系統(tǒng)上,只有 OS X v10.10及更高版本中執(zhí)行;
參數(shù)3:' * '必須寫的,用于處理未來潛在的平臺(tái);
*/
if #available(iOS 9, OSX 10.10, *) {
// 在 iOS 使用 iOS 9 的 API, 在 OS X 使用 OS X v10.10 的 API
} else {
// 使用先前版本的 iOS 和 OS X 的 API
}