Swift 5.1 (5) - 控制流

級(jí)別: ★☆☆☆☆
標(biāo)簽:「iOS」「Swift 5.1」「For-In」「標(biāo)簽語(yǔ)句」「Fallthrough」
作者: 沐靈洛
審校: QiShare團(tuán)隊(duì)


控制流

For-In循環(huán)

使用for-in循環(huán)迭代數(shù)組

let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
    print("Hello, \(name)!")
}

使用for-in循環(huán)迭代字典

let airports = ["job": "將軍", "age": "16", "name": "zhangfei"]
for (key,value) in airports {
print("\(key)")
print("\(value)")
}

使用for-in循環(huán)迭代數(shù)值范圍

for index in 1...5 {
    print("\(index) times 5 is \(index * 5)")
}

使用for-in循環(huán)迭代數(shù)值范圍之使用stride(from:to:by :)函數(shù):返回從起始值到結(jié)束值(不包括)惑灵,跳過指定量的序列魁蒜。從開始值起序列中的每個(gè)連續(xù)值都會(huì)增加相同范圍的幅度蛾派,直到下一個(gè)值等于或超過結(jié)束值。(以指定間隔迭代特定數(shù)值時(shí)的序列)电媳。符合Strideable協(xié)議的任何類型的值都可以使用此函數(shù),例如整數(shù)或浮點(diǎn)類型庆亡。

for item in stride(from: 0, to: 60, by: 5) {
    print(item, separator: "", terminator: " ")//!< 0 5 10 15 20 25 30 35 40 45 50 55
}
for item in stride(from: 0, to: Double.pi * 2, by: .pi/2) {
     print(item, separator: "", terminator: " ")//!<0.0 1.5707963267948966 3.141592653589793 4.71238898038469
}

使用for-in循環(huán)迭代數(shù)值范圍之使用stride(from:through:by:)函數(shù):返回從起始值到結(jié)束值(可能包括)匾乓,跳過指定量的序列。(以指定間隔迭代特定數(shù)值時(shí)的序列)與stride(from:to:by :)函數(shù)區(qū)別于它可能會(huì)包括結(jié)束值又谋。

for item in stride(from: 0, through: 60, by: 5) {
    print(item, separator: "", terminator: " ")//!< 0 5 10 15 20 25 30 35 40 45 50 55 60
}
for item in stride(from: 0, through: Double.pi * 2, by: .pi/2) {
     print(item, separator: "", terminator: " ")//!<0.0 1.5707963267948966 3.141592653589793 4.71238898038469 6.283185307179586 
}
While循環(huán)

Swift提供了兩種while循環(huán):

  • while:在每次循環(huán)開始時(shí)判斷條件拼缝。
  • repeat-while:在每次循環(huán)結(jié)束時(shí)判斷條件。

While
while循環(huán)開始時(shí)判斷條件是否成立彰亥,若true立即執(zhí)行方法體咧七,直到條件變?yōu)?code>false時(shí)停止執(zhí)行。

let adc = 10
var apc = 0;
while apc < adc {
    apc += 1 //!< 必須要有終止的條件 若 apc < adc 恒成立則程序陷入死循環(huán)
    print("條件成立") //10
}

Repeat-While
repeat-while循環(huán):while循環(huán)的變體任斋,類似于其他語(yǔ)言中的do-while继阻,先執(zhí)行單個(gè)循環(huán),再考慮循環(huán)條件废酷,若為true繼續(xù)重復(fù)循環(huán)瘟檩,直到條件為false停止執(zhí)行。

let adc = 10
var apc = 0;
repeat {
    apc += 1
    print("條件成立") //!< 10次
}while apc < adc
條件語(yǔ)句

If

let adc = 20
if adc <= 32 {
    print("adc <= 32")
} else if adc >= 86 {
    print("adc >= 86")
} else {
    print("32 <adc< 86")
}

Switch

let someCharacter: Character = "z"
switch someCharacter {
case "a":
    print("The first letter of the alphabet")
case "z":
    print("The last letter of the alphabet")
default:
    print("Some other character")
}

不隱式貫穿
Swift中的switch語(yǔ)句執(zhí)行時(shí)不會(huì)貫穿每個(gè)case澈蟆。而C和Objective-C中的switch語(yǔ)句需要顯式的break語(yǔ)句墨辛,若不添加則會(huì)向下貫穿到所匹配項(xiàng)下面的每個(gè)case,并執(zhí)行趴俘。

MyEnumType type = MyEnumType2;
switch (type) {
    case MyEnumType1:
        NSLog(@"MyEnumType1");
    case MyEnumType2:
        NSLog(@"MyEnumType2");
    case MyEnumType3:
        NSLog(@"MyEnumType3");
        
}
/*
 MyEnumType2
 MyEnumType3
 */

Swift中的switch語(yǔ)句只要第一個(gè)匹配的switchcase完成睹簇,整個(gè)switch語(yǔ)句就會(huì)完成執(zhí)行,而不需要顯式的break語(yǔ)句寥闪。

let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a", "A":
    print("The letter A")
default:
    print("Not the letter A")
}

Range匹配
switch語(yǔ)句可以檢測(cè)其判斷的值带膀,是否包含在某個(gè)case的范圍內(nèi)。

let adc = 20
var apc = 0;
var result = ""

switch adc {
case 0...10:
   result = "0...10"
case 11..<20:
    result = "11..<20"
case 20...30:
    result = "20...30"
default:
    result = "beyond of range"
}
print(result)//!< 20...30

元組
switch語(yǔ)句可以判斷元組的值橙垢,是否符合某個(gè)case垛叨。可以針對(duì)元組不同的值或值的間隔范圍來測(cè)試元組的每個(gè)元素∷栽或者敛纲,使用下劃線字符(通配符)_來匹配任何可能的值。

let tuples : (Int,String,Int) = (404,"not found",-1)
switch tuples {
case (300,"精準(zhǔn)匹配1",0):
    print("精準(zhǔn)匹配1")
case (0...200,"范圍匹配1",-2...10):
    print("范圍匹配1")
case (_,_,-2...2):
    print("通配符匹配元組前兩個(gè),范圍匹配最后一項(xiàng)")
default:
    print("沒有匹配到")
}

值綁定
switchcase可以命名它所匹配到的臨時(shí)的常量或變量剂癌, 以便在case對(duì)應(yīng)的方法中使用淤翔。這種行為稱為值綁定。

let anotherPoint = (2, 0)
switch anotherPoint {
case (let x, 0):
    print("橫坐標(biāo)\(x)")
case (0, let y):
    print("縱坐標(biāo) \(y)")
case let (x, y):
    print("任何點(diǎn) (\(x), \(y))")
}

上述switch語(yǔ)句中case(let x佩谷,0)匹配y值為0的任何點(diǎn)旁壮,并將點(diǎn)的x值賦給臨時(shí)常量xcase(0谐檀,let y)匹配x值為0的任何點(diǎn)抡谐,并將點(diǎn)的y值賦給臨時(shí)常量ylet(x桐猬,y)麦撵,聲明了一個(gè)可以匹配任何值的含有兩個(gè)占位符常量的元組。因?yàn)槠ヅ渌锌赡艿氖S嘀道7荆圆恍枰?code>default case來使switch語(yǔ)句窮舉免胃。
Where
switch語(yǔ)句中case可以使用where子句來檢查其他條件。

let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
case let (x, y) where x==y:
    print("匹配到x與y相同的情況")
case let(x,y) where x == -y:
    print("匹配到x與y為相反數(shù)的情況")//!<匹配到x與y為相反數(shù)的情況
default:
    print("沒有匹配的結(jié)果")
}

上述示例中switch語(yǔ)句中的case聲明占位符常量xy惫撰,它們暫時(shí)從yetAnotherPoint獲取元組值羔沙。這些常量用作where子句的一部分,用于創(chuàng)建動(dòng)態(tài)過濾器厨钻。僅當(dāng)where子句的條件對(duì)占位符常量xy的計(jì)算結(jié)果為true時(shí)撬碟,switch語(yǔ)句的case才會(huì)成功匹配當(dāng)前值。
復(fù)合使用
switch語(yǔ)句中若有多個(gè)case共享的相同方法體莉撇,可以通過在case之后組合多個(gè)模式呢蛤,每個(gè)模式之間用逗號(hào)隔開來表示。多個(gè)模式中任一個(gè)匹配棍郎,則認(rèn)為這個(gè)case是匹配的其障。同時(shí)case之后的多個(gè)模式也可以多行表示。

let someCharater = "e"
switch someCharater {
case "a","o","e","f":
    print("事例1涂佃,匹配成功")//!< log
case "b","v","r","h":
    print("事例2励翼,匹配成功")
default:
    print("未匹配")
}
//復(fù)合事例中的值綁定,綁定的值類型必須匹配辜荠。case (let x, let y), (0, let x)這種是不被允許的 因?yàn)榉椒w中使用x汽抚,y時(shí),若匹配的是 (0, let x)則y 無(wú)效伯病。因?yàn)橄嗤闹到壎☉?yīng)該存在于所有`case`之后的模式中造烁。
let stillAnotherPoint = (9, 0)
switch stillAnotherPoint {
case (let x, 0), (0, let x)://!< 'x' must be bound in every pattern:'x'必須綁定在每個(gè)模式中
    print("匹配成功")
default:
    print("未匹配")
}

switch的case后對(duì)應(yīng)多個(gè)模式的復(fù)合事例中,每個(gè)模式對(duì)應(yīng)的綁定的值類型必須匹配,并且相同的一組值綁定惭蟋,如(let x, let y)其中x苗桂,y稱為一組值綁定,應(yīng)該存在于所有case之后的模式中告组。

控制轉(zhuǎn)移語(yǔ)句

控制轉(zhuǎn)移語(yǔ)句通過將控制從一段代碼轉(zhuǎn)移到另一段代碼來改變代碼執(zhí)行的順序煤伟。Swift有五個(gè)控制轉(zhuǎn)移語(yǔ)句:

  • continue
  • break
  • fallthrough
  • return
  • throw

continue
continue語(yǔ)句:跳出正在執(zhí)行的循環(huán)語(yǔ)句,立即開始執(zhí)行下一次循環(huán)木缝。

let puzzleInput = "great minds think alike"
var puzzleOutput = ""
let charactersToRemove: [Character] = ["a", "e", "i", "o", "u", " "]
for character in puzzleInput {
    if charactersToRemove.contains(character) {
        continue
    }
    puzzleOutput.append(character)
}
print(puzzleOutput) //!< break下跳出循環(huán),立即開始下一次迭代便锨,輸出為:grtmndsthnklk

break
break語(yǔ)句:立即結(jié)束所有控制流語(yǔ)句的執(zhí)行。
循環(huán)語(yǔ)句中的break:循環(huán)語(yǔ)句中使用break我碟,會(huì)立即結(jié)束循環(huán)的執(zhí)行放案,并在循環(huán)方法體}之后將控制權(quán)轉(zhuǎn)移給后續(xù)的代碼。

let puzzleInput = "great minds think alike"
var puzzleOutput = ""
let charactersToRemove: [Character] = ["a", "e", "i", "o", "u", " "]
for character in puzzleInput {
    if charactersToRemove.contains(character) {
        break
    }
    puzzleOutput.append(character)
}
print(puzzleOutput) //!< break下跳出循環(huán)不在開始怎囚,輸出為gr

switch語(yǔ)句中的break:在switch語(yǔ)句中使用break卿叽,會(huì)使switch語(yǔ)句立即結(jié)束其執(zhí)行桥胞,并移交控制權(quán)恳守。

let stillAnotherPoint = (9, 0)
switch stillAnotherPoint {
case (let x, 0), (0, let x):
    print("匹配成功")
default:
    break
}

貫穿(Fallthrough)
如果需要C或Objective-C的貫穿行為,則可以使用fallthrough關(guān)鍵字贩虾。

let describe = 5
var description = ""
switch describe {
case 2, 3, 5, 7, 11, 13, 17, 19:
    description += "I am"
    fallthrough
case 18:
    description += " bob" //!< case 去掉fallthrough 則輸出I am bob
    fallthrough
default:
    description += " and you?"
}
print(description)//!< I am bob and you?

標(biāo)簽語(yǔ)句
在Swift中催烘,其他循環(huán)和條件語(yǔ)句中可以嵌套循環(huán)和條件語(yǔ)句,從而創(chuàng)建復(fù)雜的控制流結(jié)構(gòu)缎罢。但是伊群,循環(huán)和條件語(yǔ)句都可以使用break語(yǔ)句過早地結(jié)束執(zhí)行。因此策精,需要明確break語(yǔ)句終止的循環(huán)或條件語(yǔ)句舰始,或明確continue語(yǔ)句應(yīng)該影響哪個(gè)循環(huán)是非常必要的,故會(huì)用到標(biāo)簽語(yǔ)句咽袜。

var result = ""
let adc = 30
forLabel : for item in 9...adc {
   switchLabel :switch item {
    case 0...10:
        result += " 0...10"
        break switchLabel //!<swift中break是默認(rèn)的
    case 11..<20: //!<  若是11..<20區(qū)間則跳出for循環(huán)丸卷,開始下次迭代
        continue forLabel
    case 20://!< 若是20 則立即終止for循環(huán)
        result += " 終止for循環(huán)"
        break forLabel
    default:
        result += "beyond of range"
    }
}
print(result) //!< 0...10 0...10 終止for循環(huán)

提前退出(throw,return)
if語(yǔ)句一樣,guard語(yǔ)句根據(jù)表達(dá)式的布爾值執(zhí)行語(yǔ)句询刹。使用guard語(yǔ)句要求條件必須為true才能執(zhí)行guard語(yǔ)句之后的代碼谜嫉。與if語(yǔ)句不同,guard語(yǔ)句總是有一個(gè)else子句 如果條件為false凹联,則執(zhí)行else子句中的代碼沐兰。guardelse子句不能向下貫穿,必須使用轉(zhuǎn)移控制的語(yǔ)句returnthrow才能退出作用域蔽挠。

//return
let adc = 30
//! guard方法體不能向下貫穿住闯,需要使用`return`或`throw`退出作用域
guard adc > 30 else {
    print("條件不成立")
    return //!< 提前結(jié)束了
}
//throw退出作用域
guard adc > 30 else {
    print("條件不成立")
    throw HttpError.authError
}

檢查API可用性
Swift支持檢查API可用性:編譯器使用SDK中的可用性信息來驗(yàn)證使用的API是否在指定部署目標(biāo)上可用。確保我們不會(huì)在給定部署目標(biāo)上使用不可用的API∧海可以在ifguard語(yǔ)句中使用可用性條件進(jìn)行判斷斟叼。

if #available(iOS 10, macOS 10.12, *) {
    // Use iOS 10 APIs on iOS, and use macOS 10.12 APIs on macOS
} else {
    // Fall back to earlier iOS and macOS APIs
}

參考資料:
swift 5.1官方編程指南


推薦文章:
Xcode11 新建工程中的SceneDelegate
iOS App啟動(dòng)優(yōu)化(二)—— 使用“Time Profiler”工具監(jiān)控App的啟動(dòng)耗時(shí)
iOS App啟動(dòng)優(yōu)化(一)—— 了解App的啟動(dòng)流程
iOS WKWebView的基本使用
Swift 5.1 (4) - 集合類型
iOS 解析一個(gè)自定義協(xié)議
iOS13 DarkMode適配(二)
iOS13 DarkMode適配(一)
2019蘋果秋季新品發(fā)布會(huì)速覽

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市春寿,隨后出現(xiàn)的幾起案子朗涩,更是在濱河造成了極大的恐慌,老刑警劉巖绑改,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谢床,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡厘线,警方通過查閱死者的電腦和手機(jī)识腿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來造壮,“玉大人渡讼,你說我怎么就攤上這事《担” “怎么了咱揍?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵赁还,是天一觀的道長(zhǎng)舷蒲。 經(jīng)常有香客問我例书,道長(zhǎng),這世上最難降的妖魔是什么攀隔? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任皂贩,我火速辦了婚禮,結(jié)果婚禮上昆汹,老公的妹妹穿的比我還像新娘明刷。我一直安慰自己,他們只是感情好满粗,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布辈末。 她就那樣靜靜地躺著,像睡著了一般败潦。 火紅的嫁衣襯著肌膚如雪本冲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天劫扒,我揣著相機(jī)與錄音檬洞,去河邊找鬼。 笑死沟饥,一個(gè)胖子當(dāng)著我的面吹牛添怔,可吹牛的內(nèi)容都是我干的湾戳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼广料,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼砾脑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起艾杏,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤韧衣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后购桑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畅铭,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年勃蜘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硕噩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缭贡,死狀恐怖炉擅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阳惹,我是刑警寧澤谍失,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站穆端,受9級(jí)特大地震影響袱贮,放射性物質(zhì)發(fā)生泄漏仿便。R本人自食惡果不足惜体啰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗽仪。 院中可真熱鬧荒勇,春花似錦、人聲如沸闻坚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窿凤。三九已至仅偎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雳殊,已是汗流浹背橘沥。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夯秃,地道東北人座咆。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓痢艺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親介陶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子堤舒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 控制流 For-In循環(huán) 使用for-in循環(huán)迭代數(shù)組 使用for-in循環(huán)迭代字典 使用for-in循環(huán)迭代數(shù)值...
    沐靈洛閱讀 381評(píng)論 0 4
  • 本章將會(huì)介紹 控制流For-In 循環(huán)While 循環(huán)If 條件語(yǔ)句Switch 語(yǔ)句控制轉(zhuǎn)移語(yǔ)句 continu...
    寒橋閱讀 727評(píng)論 0 0
  • 控制流 [TOC] Swift提供了多種流程控制結(jié)構(gòu)舌缤,包括可以多次執(zhí)行任務(wù)的while循環(huán),基于特定條件選擇執(zhí)行不...
    伍哥___閱讀 514評(píng)論 0 0
  • 控制流 for循環(huán) for-in for while循環(huán) while repeat-while 條件語(yǔ)句 if s...
    zhenyu54閱讀 896評(píng)論 0 0
  • 最喜歡杜牧的還是以下兩首詩(shī): 青山隱隱水迢迢某残,秋盡江南草未凋友驮。 二十四橋明月夜,玉人何處教吹蕭驾锰。 娉娉裊裊十三余卸留,...
    荷塘低吟閱讀 207評(píng)論 0 1