概覽
在實際代碼開發中,可能初學 Swift 語言的小伙伴們在擼碼時最常用的得數 if 和 switch…case 條件選擇語句了。不過在某些場景下它們顯得略有那么一丟丟“矯揉造作”,還好從 Swift 5.9 開始蘋果知趣的為其簡化了語法且增強了它們的表現力。
在本篇博文中,您將學到如下內容:
- 概覽
- 1. Swift 中的 if 和 switch 條件語句
- 2. 三元操作符(ternary expression)
- 3. Swift 5.9 if 與 switch 簡潔的新語法
- 4. 新語法的“美中不足”
- 總結
“九尺之臺起于壘土,千里之行始于足下”,Swift 語言里 if 和 switch…case 語句是任何絕妙 App 搭建的“盤石桑苞”!
那小伙伴們還等什么呢?讓我們馬上開始燥起來吧!
Let‘s go!!!😃
1. Swift 中的 if 和 switch 條件語句
在任何語言的結構化編程模式中條件與分支判斷一直是當仁不讓的“絕對核心”,這對于 Swift 語言自然也不例外。
在 Swift 語言中我們可以使用 if…else 語句來表達一般的條件與分支判斷邏輯:
if tooBig {reductIt()
} else {usingIt()
}
我們還可以使用 else 子句進一步拓展 if 語句來匹配多種條件:
var number = 11if number == 0 {print("Zero!!!")
} else if number < 0 {print("小于零")
} else if number >= 100 && number < 1000 {print("大于等于 100,且小于1000")
} else {print("\(number) 其它情況")
}
當然,我們也可以用 switch…case 重構上面的 if…else 代碼:
switch number {
case 0:print("Zero!!!")
case ..<0:print("小于零")
case 100..<1000:print("大于等于 100,且小于1000")
default:print("\(number) 其它情況")
}
在 Swift 語言中我們同樣可以用 if + let 語句的組合來快速捕獲可選值(Optional):
var name: String? = "大熊貓侯佩"if let name = name {print("\(name)")
}
從 Swift 5.7 開始,蘋果對于上述代碼提供了更簡潔的語法:
var name: String? = "大熊貓侯佩"if let name {print("\(name)")
}
更進一步,if 語句還可以搭配 case 組合成 if case let 模式匹配語句:
enum MyError: Error {case textTooShort(actual: Int, min: Int)
}let MIN_LEN = 5
let text = "wo"do {if text.count < MIN_LEN {throw MyError.textTooShort(actual: text.count, min: MIN_LEN)}
} catch let my_error as MyError {if case MyError.textTooShort(let actual, let min) = my_error {print("輸入文字長度(\(actual))太短了,不能小于(\(min))")} else {print("其它 MyError: \(my_error)")}
} catch {print("Other ERR: \(error)")
}
在上面的代碼中,我們使用模式匹配 if case let 語句優雅的將特定錯誤所綁定的信息解析了出來。
關于 Swift 中模式匹配的進一步詳細介紹請小伙伴們移步如下博文觀賞:
- Swift 入門之自定義類型的模式匹配(Pattern Matching)
- Swift 初學者趣談:一招教你記住模式匹配 if case let 的語法,永不忘記
2. 三元操作符(ternary expression)
然而,在某些簡單情況下我們希望條件選擇語句越簡約越好,比如在下面的例子中我們利用 if…else 語句依照條件(isNeedShortName)的不同值產生了對應不同的 personName 變量,一個 personName 要寫 3 遍,這你們也能忍?
struct Person {var name: Stringvar shortName: String
}let hopy = Person(name: "大熊貓侯佩", shortName: "hopy")
let isNeedShortName = true// personName 變量名稱多次出現,略顯冗余
let personName: String
if isNeedShortName {personName = hopy.shortName
} else {personName = hopy.name
}
所幸的是和其它語言類似,Swift 也提供了三元操作符(ternary expression)來簡化條件選擇邏輯:
let hopy = Person(name: "大熊貓侯佩", shortName: "hopy")
let isNeedShortName = true
let personName = isNeedShortName ? hopy.shortName : hopy.name
可以看到使用三元操作符讓原來繁瑣的代碼變得“輕騎減從”了。但是因為三元操作符將全部邏輯都放在同一行中,過度使用它有可能讓代碼變得更加晦澀難懂。
這又該如何是好呢?
更多關于 Swift 基礎指令、操作符和語法的系統性學習,請小伙伴們來我的博客專欄恣意吸取養分:
- Swift 語言開發精講
3. Swift 5.9 if 與 switch 簡潔的新語法
前文提到了濫用三元操作符可能出現的一些弊端。
不過別著急,從 Swift 5.9 開始蘋果精簡和完善了 if 與 switch 的語法,讓條件選擇既能層次分明又能言簡意賅:
let hopy = Person(name: "大熊貓侯佩", shortName: "hopy")
let isNeedShortName = truelet personName = if isNeedShortName {hopy.shortName
} else {hopy.name
}
從上面代碼可以看出:新語法讓禿頭碼農們只需書寫一次 personName 變量。我們硬是將 if…else 語法寫出了三元操作符的“小鳥依人”,同時做到了楚楚有致,這讓我們怎能“云胡不喜”呢?
新語法同樣也可以用在 switch…case 語句上:
enum Size {case small, mid, big
}let size = Size.midlet sizeDesc = switch size {
case .small:"小號"
case .mid:"中號"
case .big:"大號"
}
Swift 5.9 中新語法除了對尋常條件判斷表達式的簡化“有如神助”以外,我們還可以進一步如法炮制利用它們來精簡其它類似的邏輯:
struct Msg {var emergencyDegree = 0var msgColor: Color {switch emergencyDegree {case 0..<5:.graycase 5..<10:.greencase 10..<15:.yellowcase 15..<20:.orangedefault:.red}}
}let msg = Msg(emergencyDegree: 20)
print(msg.msgColor)
比如在上面的代碼中,Swift 5.9 新語法在 msgColor 計算屬性的定義中為我們解囊相助省去了海量的 return 語句,就問你們贊不贊!?
4. 新語法的“美中不足”
雖然 Swift 5.9 新語法很好很強大,但是目前對于 if 相關的語法還是有一些“限制”的。
首先 if 必須帶上 else 子句。
不過,想想這也合情合理,如若不然我們就無法顧及到每種可能的條件了。
另一個局限是新 if 語句中不能出現多行代碼,比如下面示例就無法通過編譯:
let hopy = Person(name: "大熊貓侯佩", shortName: "hopy")
let isNeedShortName = truelet personName = if isNeedShortName {print("for short name")hopy.shortName
} else {print("for full name")hopy.name
}
關于該特性孰是孰非的全面討論,請大家移步到蘋果官方開發者論壇邊吃瓜邊觀賞“神仙打架”:
- discussion about this on the Swift Forums
至此,我們徹底弄明白了 Swift 5.9 中新條件選擇語法帶來的巨大便利,借助于他的東風我們又可以愉快的進行擼碼造福世界人民了,棒棒噠!💯
總結
在本篇博文中,我們介紹了 Swift 語言中條件選擇指令的“前世今生”,并討論了 Swift 5.9 中 if 和 switch 語句更簡潔的新語法。
感謝觀賞,再會!😎