問題引出:
swift 神奇的引入了一個類型——可選類型(optionals)。
但是,我們要是按照以往(比如OC)的套路在使用可選類型定義的常量的時候,又會讓你崩潰抓狂。
因爲 swift 是類型安全的語言,所以可選類型的常量在 if
判斷之後仍然需要 解包(!
) 。如下:
let name: String? = "老王"
let age: Int? = 10
if name != nil && age != nil {
print(name! + String(age!)) // 輸出:老王10
}
倘若,你不加上 !
,根本就不會讓你編譯通過,而,加上呢?又會如此的麻煩。難道優雅的 swift 就沒有解決辦法嗎?
答案,顯然是有的—— if let
。
-
if let
if let
的標準套路:if let constantName = someOptional { //statements using 'constantName' } else { // the value of someOptional is not set (or nil). }
誠如上面的栗子,倘若通過
if let
加以實現,就不需要 解包(!
) 的操作了,甚至可以添加多個條件,,
隔開即可:let name: String? = "老王" let age: Int? = 10 // if let 連用,判斷對象的值是否爲'nil' if let nameNew = name, let ageNew = age { // 進入分支後,nameNew 和 ageNew 一定有值 print(nameNew + String(ageNew)) // 輸出:老王10 }
需要注意的是:
if let
轉換的 常量 的作用域只是在if let {}
中。
-
if var
if var
與if let
的用法、語法都是基本相同的,唯一的區別是if var
轉換出來是 變量 ,並且,這個 變量 在其作用域{}
內是可以修改其值的。如下:let name: String? = "老王" let age: Int? = 10 if var nameNew = name, let ageNew = age { // 'var'修飾,可以修改'nameNew'的值,'let'修改的不可以修改 nameNew = "老李" print(nameNew + String(ageNew)) // 輸出:老李10 }
雖然
if var
在其作用域{}
內是可以修改其值的,但是問題是,更改的值出了作用域之後就失效了,所以通常在實際開發中,並沒有太常用。到這裏,文章開始的問題已經被優雅的
swift
化解了,但是依舊不是很完美,正如上面提到的if let/var
的缺點:作用域太狹窄 。所以,
swift
當然不可能止步於此。良心推薦:
guard let/var
-
guard let/var
我們通常說
guard
是爲了守護一定有值。套路如下:guard let/var constantName = expression else { return value }
比如,上面的栗子我們就可以這麼寫了:
let name: String? = "老王" let age: Int? = 10 guard let nameNew = name, let ageNew = age else { print("姓名 或 年齡 爲nil") return } // 代碼執行至此, nameNew 和 ageNew 一定有值 print(nameNew + String(ageNew)) // 輸出:老王10
guard
就保證了它之後的代碼相關值是肯定有的。guard
僅在條件爲假時運行,並且將通過諸如return,break,continue或thrown之類的控制轉移語句退出代碼塊。它提供的這種 提前退出 意味着更快的執行。而且,語法上少了一層括號,更簡潔一些,不是嗎?
更重要的是:
guard let/var
彌補了if let/var
的缺陷,可以在{}
以外的地方繼續使用甚至修改(var
)。let name: String? = "老王" let age: Int? = 10 guard var nameNew = name, let ageNew = age else { // 'var'修飾,可以修改'nameNew'的值,'let'修改的不可以修改 nameNew = "老李" print(nameNew + String(ageNew)) // 輸出:老李10 } print(nameNew + String(ageNew)) // 輸出:老李10 nameNew = "老張" print(nameNew + String(ageNew)) // 輸出:老張10
搞定收工!
至此,有沒有解決你的疑問了?評論告訴我。
喜歡我的可以關注收藏我的個人博客:Ro.bber