指南:控制流(Control Flow)

For-In 循環(huán)(For-In Loops)

  • 如果不需要知道區(qū)間序列內(nèi)每一項(xiàng)的值簿煌,你可以使用下劃線(_)替代變量名來忽略對值的訪問:
let base = 3
let power = 10
var answer = 1
for _ in 1...power {
    answer *= base
}
print("\(base) to the power of \(power) is \(answer)")
// 輸出 "3 to the power of 10 is 59049"

While 循環(huán)(While Loops)

  • Swift語言的repeat-while循環(huán)合其他語言中的do-while循環(huán)是類似的蔼啦。
repeat {
    statements
} while condition

Switch

  • switch語句必須是完備的糟红。這就是說驱负,每一個(gè)可能的值都必須至少有一個(gè) case 分支與之對應(yīng)奈应。在某些不可能涵蓋所有值的情況下浩销,你可以使用默認(rèn)(default)分支滿足該要求,這個(gè)默認(rèn)分支必須在switch語句的最后面谴麦。
  • 與 C 語言和 Objective-C 中的switch語句不同蠢沿,在 Swift 中,當(dāng)匹配的 case 分支中的代碼執(zhí)行完畢后匾效,程序會終止switch語句舷蟀,而不會繼續(xù)執(zhí)行下一個(gè) case 分支。這也就是說面哼,不需要在 case 分支中顯式地使用break語句野宜。
  • 一個(gè) case 也可以包含多個(gè)模式,用逗號把它們分開(如果太長了也可以分行寫):
  • case 分支的模式也可以是一個(gè)值的區(qū)間魔策。
  • 可以使用元組在同一個(gè)switch語句中測試多個(gè)值匈子。元組中的元素可以是值,也可以是區(qū)間代乃。另外旬牲,使用下劃線(_)來匹配所有可能的值仿粹。
  • case 分支的模式允許將匹配的值綁定到一個(gè)臨時(shí)的常量或變量搁吓,這些常量或變量在該 case 分支里就可以被引用了——這種行為被稱為值綁定(value binding)原茅。
  • case 分支的模式可以使用where語句來判斷額外的條件。
let someCharacter: Character = "e"
switch someCharacter {
case "a", "e", "i", "o", "u":
    print("\(someCharacter) is a vowel")
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
    print("\(someCharacter) is a consonant")
default:
    print("\(someCharacter) is not a vowel or a consonant")
}
// 輸出 "e is a vowel"

let approximateCount = 62
let countedThings = "moons orbiting Saturn"
var naturalCount: String
switch approximateCount {
case 0:
    naturalCount = "no"
case 1..<5:
    naturalCount = "a few"
case 5..<12:
    naturalCount = "several"
case 12..<100:
    naturalCount = "dozens of"
case 100..<1000:
    naturalCount = "hundreds of"
default:
    naturalCount = "many"
}
print("There are \(naturalCount) \(countedThings).")
// 輸出 "There are dozens of moons orbiting Saturn."

let somePoint = (1, 1)
switch somePoint {
case (0, 0):
    print("(0, 0) is at the origin")
case (_, 0):
    print("(\(somePoint.0), 0) is on the x-axis")
case (0, _):
    print("(0, \(somePoint.1)) is on the y-axis")
case (-2...2, -2...2):
    print("(\(somePoint.0), \(somePoint.1)) is inside the box")
default:
    print("(\(somePoint.0), \(somePoint.1)) is outside of the box")
}
// 輸出 "(1, 1) is inside the box"

let anotherPoint = (2, 0)
switch anotherPoint {
case (let x, 0):
    print("on the x-axis with an x value of \(x)")
case (0, let y):
    print("on the y-axis with a y value of \(y)")
case let (x, y):
    print("somewhere else at (\(x), \(y))")
}
// 輸出 "on the x-axis with an x value of 2"

let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
case let (x, y) where x == y:
    print("(\(x), \(y)) is on the line x == y")
case let (x, y) where x == -y:
    print("(\(x), \(y)) is on the line x == -y")
case let (x, y):
    print("(\(x), \(y)) is just some arbitrary point")
}
// 輸出 "(1, -1) is on the line x == -y"

控制轉(zhuǎn)移語句(Control Transfer Statements)

  • 當(dāng)一個(gè)switch分支僅僅包含注釋時(shí)堕仔,會被報(bào)編譯時(shí)錯(cuò)誤擂橘。注釋不是代碼語句而且也不能讓switch分支達(dá)到被忽略的效果。你總是可以使用break來忽略某個(gè)分支摩骨。
let numberSymbol: Character = "三"  // 簡體中文里的數(shù)字 3
var possibleIntegerValue: Int?
switch numberSymbol {
case "1", "?", "一", "?":
    possibleIntegerValue = 1
case "2", "?", "二", "?":
    possibleIntegerValue = 2
case "3", "?", "三", "?":
    possibleIntegerValue = 3
case "4", "?", "四", "?":
    possibleIntegerValue = 4
default:
    break
}
if let integerValue = possibleIntegerValue {
    print("The integer value of \(numberSymbol) is \(integerValue).")
} else {
    print("An integer value could not be found for \(numberSymbol).")
}
// 輸出 "The integer value of 三 is 3."
  • 如果你確實(shí)需要 C 風(fēng)格的貫穿的特性通贞,你可以在每個(gè)需要該特性的 case 分支中使用fallthrough關(guān)鍵字。如果不是必須恼五,一般不要這么做昌罩。

提前退出(Early Exit)

可以使用guard語句來要求條件必須為真時(shí),以執(zhí)行g(shù)uard語句后的代碼灾馒。一個(gè)guard語句總是有一個(gè)else分句茎用,如果條件不為真則執(zhí)行else分句中的代碼。
相比于可以實(shí)現(xiàn)同樣功能的if語句睬罗,按需使用guard語句會提升我們代碼的可靠性轨功。它可以使你的代碼連貫的被執(zhí)行而不需要將它包在else塊中,它可以使你處理違反要求的代碼接近要求容达。這個(gè)功能推薦使用古涧。

func greet(person: [String: String]) {
    guard let name = person["name"] else {
        return
    }
    print("Hello \(name)")

    guard let location = person["location"] else {
        print("I hope the weather is nice near you.")
        return
    }
    print("I hope the weather is nice in \(location).")
}
greet(["name": "John"])
// 輸出 "Hello John!"
// 輸出 "I hope the weather is nice near you."
greet(["name": "Jane", "location": "Cupertino"])
// 輸出 "Hello Jane!"
// 輸出 "I hope the weather is nice in Cupertino."

檢測 API 可用性(Checking API Availability)

if #available(iOS 9, OSX 10.10, *) {
    // 在 iOS 使用 iOS 9 的 API, 在 OS X 使用 OS X v10.10 的 API
} else {
    // 使用先前版本的 iOS 和 OS X 的 API
}

這種用法推薦使用,就用這個(gè)經(jīng)典結(jié)構(gòu)花盐,隨時(shí)兼容最新的iOS特性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末羡滑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子算芯,更是在濱河造成了極大的恐慌啄栓,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件也祠,死亡現(xiàn)場離奇詭異昙楚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)诈嘿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門堪旧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奖亚,你說我怎么就攤上這事淳梦。” “怎么了昔字?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵爆袍,是天一觀的道長首繁。 經(jīng)常有香客問我,道長陨囊,這世上最難降的妖魔是什么弦疮? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蜘醋,結(jié)果婚禮上胁塞,老公的妹妹穿的比我還像新娘。我一直安慰自己压语,他們只是感情好啸罢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胎食,像睡著了一般扰才。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厕怜,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天衩匣,我揣著相機(jī)與錄音,去河邊找鬼酣倾。 笑死舵揭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的躁锡。 我是一名探鬼主播午绳,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼映之!你這毒婦竟也來了拦焚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤杠输,失蹤者是張志新(化名)和其女友劉穎赎败,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蠢甲,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡僵刮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹦牛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搞糕。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖曼追,靈堂內(nèi)的尸體忽然破棺而出窍仰,到底是詐尸還是另有隱情,我是刑警寧澤礼殊,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布驹吮,位于F島的核電站针史,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碟狞。R本人自食惡果不足惜啄枕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望篷就。 院中可真熱鬧射亏,春花似錦近忙、人聲如沸竭业。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽未辆。三九已至,卻和暖如春锯玛,著一層夾襖步出監(jiān)牢的瞬間咐柜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工攘残, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拙友,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓歼郭,卻偏偏與公主長得像遗契,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子病曾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

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

  • [The Swift Programming Language 中文版]本頁包含內(nèi)容: Swift提供了多種流程控...
    風(fēng)林山火閱讀 559評論 0 0
  • Swift 提供了類似 C 語言的流程控制結(jié)構(gòu)牍蜂,包括可以多次執(zhí)行任務(wù)的for和while循環(huán),基于特定條件選擇執(zhí)行...
    窮人家的孩紙閱讀 693評論 1 1
  • 本章將會介紹 控制流For-In 循環(huán)While 循環(huán)If 條件語句Switch 語句控制轉(zhuǎn)移語句 continu...
    寒橋閱讀 715評論 0 0
  • Swift提供了多種控制流聲明。包括while循環(huán)來多次執(zhí)行一個(gè)任務(wù)逼蒙;if从绘,guard和switch聲明來根據(jù)確定...
    BoomLee閱讀 1,939評論 0 3
  • 我知道不能以忙作為借口,但最近臨近期末了是牢,完成老師的作業(yè)僵井,復(fù)習(xí)考試,在培訓(xùn)中心上舞蹈課等等花去了太多的時(shí)間妖泄。微商驹沿,...
    敢小姐123閱讀 146評論 0 0