continue, break, fallthrough, guard, 檢測(cè) API 可用性
//控制轉(zhuǎn)移語(yǔ)句
//Swift 包含 5種控制轉(zhuǎn)移語(yǔ)句: continue,break,fallthrough,return,throw
//1.continue
//continue 語(yǔ)句的作用是終止本次循環(huán),進(jìn)入下一次循環(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)
}
}
//2.break
//break 語(yǔ)句會(huì)立刻結(jié)束整個(gè)控制流的執(zhí)行.
//3.fallthrough
//在 C 語(yǔ)言的 switch 語(yǔ)句中,需要在每個(gè) case 語(yǔ)句內(nèi)插入 break 語(yǔ)句,以阻止自動(dòng)進(jìn)入下一個(gè) case 分支內(nèi). Swift 內(nèi)的 switch 語(yǔ)句在匹配到正確的 case 后,會(huì)自動(dòng)結(jié)束整個(gè) switch 語(yǔ)句的執(zhí)行,避免了自動(dòng)進(jìn)入下一個(gè) case 語(yǔ)句,所以無(wú)需插入 break 語(yǔ)句.但如果需要在 Switft 語(yǔ)言內(nèi)保持 C 語(yǔ)言風(fēng)格的貫穿的特性, 可以在每個(gè)需要該特性的 case 分支內(nèi)使用 fallthrough 關(guān)鍵字.
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)
//注:fallthrough 關(guān)鍵字不會(huì)檢查它下一個(gè)將會(huì)落入執(zhí)行的 case 中的匹配條件, fallthrough 簡(jiǎn)單地使用代碼繼續(xù)連接到下一個(gè) case 中的代碼,這和 C 語(yǔ)言標(biāo)準(zhǔn)中的 switch 語(yǔ)句特性是一樣的.
//4.提前退出 guard
//guard 的執(zhí)行取決于一個(gè)表達(dá)式的布爾值,我們可以使用 guard 語(yǔ)句來(lái)要求條件必須為真時(shí),以執(zhí)行 guard 語(yǔ)句后的代碼.不同于 if 語(yǔ)句,一個(gè) guard 語(yǔ)句總是有一個(gè) else 從句,如果條件不為真則執(zhí)行 else 從句中的代碼.
// 如果 guard 語(yǔ)句的條件被滿足,則執(zhí)行 guard 語(yǔ)句大括號(hào)后面的代碼.將常量或者變量的可選綁定作為 guard 語(yǔ)句的條件,都可以保護(hù) guard 語(yǔ)句后面的代碼.
//如果條件不滿足,在 else 分支上的代碼就會(huì)被執(zhí)行,這個(gè)分支必須轉(zhuǎn)移控制以退出 guard 語(yǔ)句出現(xiàn)的代碼段.可以使用控制轉(zhuǎn)移語(yǔ)句做這件事,或者調(diào)用一個(gè)不返回的方法或函數(shù),例如: fatalError().
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(person: ["name":"John"])
//相比于 if 語(yǔ)句, guard 語(yǔ)句可以提升代碼的可讀性,它可以使代碼連貫的被執(zhí)行而不需要將它包在 else 塊中.
//5.檢測(cè) API 可用性
//我們可在 if 或 guard 語(yǔ)句中使用 可用性條件(availability condition)去有條件的執(zhí)行一段代碼,來(lái)在運(yùn)行時(shí)判斷調(diào)用的 API 是否可用.編譯器使用從可用性條件語(yǔ)句中獲取的信息去驗(yàn)證,在這個(gè)代碼塊中調(diào)用的 API 是否可用.
if #available(iOS 10, macOS 10.12, *) {
// 在 iOS 使用 iOS 10 的 API, 在 macOS 使用 macOS 10.12 的 API
// 最后一個(gè)參數(shù) * 是必需的,用于指定在所有其他平臺(tái)中,如果版本號(hào)高于你的設(shè)備指定的最低版本, if 語(yǔ)句的代碼塊將會(huì)運(yùn)行.
} else {
// 使用先前版本的 iOS 和 macOS 的 API
}
/**
if #available(platform name version, ..., *) {
APIs 可用,語(yǔ)句將執(zhí)行
} else {
APIs 不可用,語(yǔ)句將不執(zhí)行
}
*/