optional binding 的串接

Swift 的 optiona binding 有著十分厲害的串接技術,不只可以一次比對多個 optional 變數, 還能同時將讀出的 optional 內容做比較。接下來,我們就以 BMI 的計算例子,一步一腳印地觀察它的演進吧。

有時候我們運氣不好,遇到多個變數都是 optional,此時程式將變得十分複雜,比方以下計算 BMI 的例子:

var height: Double? = 1.71var weight: Double? = 55if let height = height {    if let weight = weight {        let bmi = weight / (height * height)    }}

經過兩次的 optional binding 讀出身高和體重的數字後,我們才能計算 BMI。而且 BMI 還算簡單的計算,只用到兩個變數。如果是更複雜的計算,使用到十個 optional 變數,我們光 if let 就要寫到天荒地老。

其實 optional binding 的能力不僅於此,它可以一次比對多個 optional。

var height: Double? = 1.71var weight: Double? = 55if let height = height, let weight = weight {    let bmi = weight / (height * height)}

當我們有多個 optional 時,只要寫一次 if let,然後利用逗號即可串接比對下個 optional。唯有當全部的 optional 都有值時,整個 if 的判斷才成立。(注意逗號之後的 optional binding 不需要 if,只需要 let。)

我們都知道這個世界是不公平的,假設只有身高一米七以上,體重五十公斤以上的人,才有資格計算 BMI,此時程式碼將變成這樣:

var height: Double? = 1.71var weight: Double? = 55if let height = height, 
  let weight = weight {
if height > 1.7 && weight > 50 { let bmi = weight / (height * height) }}

optional binding 的串接能力遠超出我們想像,甚至還可將讀出的 optional 內容做比較,以逗號串接,全部一行搞定,不用再另外寫在 { } 裡。

var height: Double? = 1.71var weight: Double? = 55if let height = height, 
  let weight = weight,
  height > 1.7 && weight > 50 {
let bmi = weight / (height * height)}

只有當 height 和 weight 都有值,且 height 大於 1.7,weight 大於 50 時,if 才會成立。

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com