03-Swift控制流

一、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軸中
  • switchwhere模式。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
}


注:xcode7.3環(huán)境

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,772評(píng)論 3 422
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,960評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,350評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,549評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,104評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,914評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,089評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,340評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評(píng)論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,834評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,106評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容