Swift語法總結-控制流

1.For-In 循環(huán)

可以使用for-in 循環(huán)來遍歷一個集合中的所有元素宪卿,例如數(shù)字范圍丧荐、數(shù)組中的元素或者字符串中的字符。

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

如果你不需要區(qū)間序列內每一項的值烟瞧,你可以使用下劃線( _ )替代變量名來忽略這個值:

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"

使用for-in 遍歷一個數(shù)組所有元素:

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

也可以通過遍歷一個字典來訪問它的鍵值對。遍歷字典時染簇,字典的每項元素會以(key, value) 元組的形式返回参滴,你可以在for-in 循環(huán)中使用顯式的常量名稱來解讀(key, value) 元組

let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
    print("(animalName)s have (legCount) legs")
}
// ants have 6 legs
// cats have 4 legs
// spiders have 8 legs
2.While 循環(huán)

while 循環(huán)會一直運行一段語句直到條件變成false 。這類循環(huán)適合使用在第一次迭代前锻弓,迭代次數(shù)未知的情況下砾赔。Swift 提供兩種while 循環(huán)形式:

? while 循環(huán),每次在循環(huán)開始時計算條件是否符合青灼;
? repeat-while 循環(huán)暴心,每次在循環(huán)結束時計算條件是否符合。
2.1While

while 循環(huán)從計算一個條件開始杂拨。如果條件為true 专普,會重復運行一段語句,直到條件變?yōu)閒alse 弹沽。

while condition {
    statements
}
2.2Repeat-While

它和while 的區(qū)別是在判斷循環(huán)條件之前檀夹,先執(zhí)行一次循環(huán)的代碼塊筋粗。然后重復循環(huán)直到條件為false 。

repeat {
    statements
} while condition
3.條件語句

Swift 提供兩種類型的條件語句: if 語句和switch 語句炸渡。通常娜亿,當條件較為簡單且可能的情況很少時,使用if 語句蚌堵。而switch 語句更適用于條件較復雜买决、有更多排列組合的時候。并且switch 在需要用到模式匹配(pattern-matching)的情況下會更有用辰斋。

3.1If

if 語句最簡單的形式就是只包含一個條件策州,只有該條件為true 時,才執(zhí)行相關代碼:

var temperatureInFahrenheit = 30
if temperatureInFahrenheit <= 32 {
    print("It's very cold. Consider wearing a scarf.")
}
// 輸出 "It's very cold. Consider wearing a scarf."
3.2Switch

switch 語句會嘗試把某個值與若干個模式(pattern)進行匹配宫仗。根據(jù)第一個匹配成功的模式够挂, switch 語句會執(zhí)行對應的代碼。當有可能的情況較多時藕夫,通常用switch 語句替換if 語句孽糖。

switch some value to consider {
    case value 1:
        respond to value 1
    case value 2,
        value 3:
        respond to value 2 or 3
    default:
        otherwise, do something else
}

注意:與 C 和 Objective-C 中的switch 語句不同,在 Swift 中毅贮,當匹配的 case 分支中的代碼執(zhí)行完畢后办悟,
程序會終止switch 語句,而不會繼續(xù)執(zhí)行下一個 case 分支滩褥。
這也就是說病蛉,不需要在 case 分支中顯式地使用break 語句。
這使得switch 語句更安全瑰煎、更易用铺然,也避免了因忘記寫break 語句而產(chǎn)生的錯誤。

區(qū)間匹配
case 分支的模式也可以是一個值的區(qū)間酒甸。下面的例子展示了如何使用區(qū)間匹配來輸出任意數(shù)字對應的自然語言格式:

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."

元組
我們可以使用元組在同一個switch 語句中測試多個值魄健。元組中的元素可以是值,也可以是區(qū)間插勤。另外沽瘦,使用下劃線( _ )來匹配所有可能的值。

//展示了如何使用一個(Int, Int) 類型的元組來分類下圖中的點(x, y):
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"

值綁定(Value Bindings)
case 分支允許將匹配的值綁定到一個臨時的常量或變量农尖,并且在case分支體內使用 —— 這種行為被稱為值綁定(value binding)析恋,因為匹配的值在case分支體內,與臨時的常量或變量綁定卤橄。

//展示了如何在一個(Int, Int) 類型的元組中使用值綁定來分類下圖中的點(x, y):
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"

Where
case 分支的模式可以使用where 語句來判斷額外的條件绿满。

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"

復合匹配
當多個條件可以使用同一種方法來處理時,可以將這幾種可能放在同一個case 后面窟扑,并且用逗號隔開喇颁。當case后面的任意一種模式匹配的時候漏健,這條分支就會被匹配。并且橘霎,如果匹配列表過長蔫浆,還可以分行書寫:

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"
4.控制轉移語句

控制轉移語句改變你代碼的執(zhí)行順序,通過它可以實現(xiàn)代碼的跳轉姐叁。Swift 有五種控制轉移語句:
? continue
? break
? fallthrough
? return
? throw

4.1Continue

continue 語句告訴一個循環(huán)體立刻停止本次循環(huán)瓦盛,重新開始下次循環(huán)。就好像在說“本次循環(huán)我已經(jīng)執(zhí)行完了”外潜,但是并不會離開整個循環(huán)體原环。

let puzzleInput = "great minds think alike"
var puzzleOutput = ""
for character in puzzleInput.characters {
    switch character {
        case "a", "e", "i", "o", "u", " ":
            continue
        default:
            puzzleOutput.append(character)
    }
}
print(puzzleOutput)
// 輸出 "grtmndsthnklk"
4.2Break

break 語句會立刻結束整個控制流的執(zhí)行。當你想要更早的結束一個switch 代碼塊或者一個循環(huán)體時处窥,你都可以使用break 語句嘱吗。

<1>循環(huán)語句中的 break
當在一個循環(huán)體中使用break 時,會立刻中斷該循環(huán)體的執(zhí)行滔驾,然后跳轉到表示循環(huán)體結束的大括號( } )后的第一行代碼谒麦。不會再有本次循環(huán)的代碼被執(zhí)行,也不會再有下次的循環(huán)產(chǎn)生哆致。

<2>Switch 語句中的 break
當在一個switch 代碼塊中使用break 時绕德,會立即中斷該switch 代碼塊的執(zhí)行,并且跳轉到表示switch 代碼塊結束的大括號( } )后的第一行代碼摊阀。

4.3fallthrough-貫穿

如果你確實需要 C 風格的貫穿的特性耻蛇,你可以在每個需要該特性的 case 分支中使用fallthrough 關鍵字。下面的例子使用fallthrough 來創(chuàng)建一個數(shù)字的描述語句胞此。

let integerToDescribe = 5
var description = "The number \(integerToDescribe) is"
switch integerToDescribe {
    case 2, 3, 5, 7, 11, 13, 17, 19:
        description += " a prime number, and also"
        fallthrough
    default:
        description += " an integer."
}
print(description)
// 輸出 "The number 5 is a prime number, and also an integer."

注意: fallthrough 關鍵字不會檢查它下一個將會落入執(zhí)行的 case 中的匹配條件城丧。fallthrough 簡單地使代碼繼續(xù)連接到下一個 case 中的代碼,這和 C 語言標準中的switch 語句特性是一樣的豌鹤。

4.4帶標簽的語句

你可以使用標簽(statement label)來標記一個循環(huán)體或者條件語句,對于一個條件語句枝缔,你可以使用break 加標簽的方式布疙,來結束這個被標記的語句。對于一個循環(huán)語句愿卸,你可以使用break 或者continue 加標簽灵临,來結束或者繼續(xù)這條被標記語句的執(zhí)行。

gameLoop: while square != finalSquare {
    diceRoll += 1
    if diceRoll == 7 { diceRoll = 1 }
    switch square + diceRoll {
        case finalSquare:
            // 骰子數(shù)剛好使玩家移動到最終的方格里趴荸,游戲結束儒溉。
            break gameLoop
        case let newSquare where newSquare > finalSquare:
            // 骰子數(shù)將會使玩家的移動超出最后的方格,那么這種移動是不合法的发钝,玩家需要重新擲骰子
            continue gameLoop
        default:
            // 合法移動顿涣,做正常的處理
            square += diceRoll
            square += board[square]
      }
}
print("Game over!")
5.0提前退出

像if 語句一樣波闹, guard 的執(zhí)行取決于一個表達式的布爾值。我們可以使用guard 語句來要求條件必須為真時涛碑,以執(zhí)行guard 語句后的代碼精堕。不同于if 語句,一個guard 語句總是有一個else 從句蒲障,如果條件不為真則執(zhí)行else 從句中的代碼歹篓。

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."
6.0檢測 API 可用性

我們在if 或guard 語句中使用可用性條件(availability condition) 去有條件的執(zhí)行一段代碼,來在運行時判斷調用的API是否可用揉阎。編譯器使用從可用性條件語句中獲取的信息去驗證庄撮,在這個代碼塊中調用的 API 是否可用。

if #available(iOS 10, macOS 10.12, *) {
    // 在 iOS 使用 iOS 10 的 API, 在 macOS 使用 macOS 10.12 的 API
} else {
    // 使用先前版本的 iOS 和 macOS 的 API
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末毙籽,一起剝皮案震驚了整個濱河市洞斯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惧财,老刑警劉巖巡扇,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異垮衷,居然都是意外死亡厅翔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門搀突,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刀闷,“玉大人,你說我怎么就攤上這事仰迁〉榛瑁” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵徐许,是天一觀的道長施蜜。 經(jīng)常有香客問我,道長雌隅,這世上最難降的妖魔是什么翻默? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮恰起,結果婚禮上修械,老公的妹妹穿的比我還像新娘。我一直安慰自己检盼,他們只是感情好肯污,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般蹦渣。 火紅的嫁衣襯著肌膚如雪哄芜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天剂桥,我揣著相機與錄音忠烛,去河邊找鬼。 笑死权逗,一個胖子當著我的面吹牛美尸,可吹牛的內容都是我干的。 我是一名探鬼主播斟薇,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼师坎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了堪滨?” 一聲冷哼從身側響起胯陋,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袱箱,沒想到半個月后遏乔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡发笔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年盟萨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片了讨。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡捻激,死狀恐怖,靈堂內的尸體忽然破棺而出前计,到底是詐尸還是另有隱情胞谭,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布男杈,位于F島的核電站丈屹,受9級特大地震影響,放射性物質發(fā)生泄漏伶棒。R本人自食惡果不足惜泉瞻,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苞冯。 院中可真熱鬧,春花似錦侧巨、人聲如沸舅锄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽皇忿。三九已至畴蹭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鳍烁,已是汗流浹背叨襟。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留幔荒,地道東北人糊闽。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像爹梁,于是被迫代替她去往敵國和親右犹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容

  • 本章將會介紹 控制流For-In 循環(huán)While 循環(huán)If 條件語句Switch 語句控制轉移語句 continu...
    寒橋閱讀 714評論 0 0
  • Swift 提供了類似 C 語言的流程控制結構,包括可以多次執(zhí)行任務的for和while循環(huán)积糯,基于特定條件選擇執(zhí)行...
    窮人家的孩紙閱讀 690評論 1 1
  • Swift提供了多種控制流聲明掂墓。包括while循環(huán)來多次執(zhí)行一個任務;if看成,guard和switch聲明來根據(jù)確定...
    BoomLee閱讀 1,932評論 0 3
  • 控制流 for循環(huán) for-in for while循環(huán) while repeat-while 條件語句 if s...
    zhenyu54閱讀 879評論 0 0
  • 寒假回到家的這段時間君编,我常常在下午出門跑步,跑到很遠很遠的地方绍昂,然后走回來啦粹。一路上沒有塞在耳朵里的音樂,有風聲窘游,偶...
    色彩鮮艷的胖紙閱讀 354評論 0 1