概述
Swift 是一門類型安全的語言。Swift的可選類型會進行編譯檢查,防止一些常見的運行時錯誤。在 Swift 中,當我們聲明一個變量的時候,默認情況下是 非可選類型 (non-optional) ,也就是說,你必須指定一個不為 nil 的值。如果你硬是要把一個非可選類型的變量設(shè)為 nil ,那么編譯器就會報錯。
Swift中的nil,必須用可選類型接收。你可以給可選類型賦值為nil來表示他沒有值,如果你聲明一個可選常量或者變量但是沒有賦值,它們會自動被設(shè)置為 nil ,也就是說可選類型可以為nil也可以有值,非可選類型不能為nil必須有值。Swift 的 nil 和 Objective-C 中的 nil 并不一樣。在 Objective-C 中,nil 是一個指向不存在對象的指針。在 Swift 中,nil 不是指針——它是一個確定的值,用來表示值缺失。任何類型的可選狀態(tài)都可以被設(shè)置為 nil,不只是對象類型。
強制解包
當你確定可選類型一定包含值之后,你可以在可選的名字后面加一個感嘆號!來解包獲取值。這被稱為可選值得強制解包(forced unwrapping)
例如:
var user_name: String?
...
if user_name != nil {
print("user_name:", user_name!)
}
可選綁定
使用可選綁定可以去辨別一個可選類型是否包含值,如果包含就把值賦給一個臨時常量或變量
if let name = user_name {
print("user_name:", name)
}
在 if 條件語句中使用常量和變量來創(chuàng)建一個可選綁定,僅在 if 語句的第一個分支中才能獲取到值。相反,在 guard 語句中使用常量和變量來創(chuàng)建一個可選綁定,僅在 guard 語句外且在語句后才能獲取到值,guard和let是相反的。
guard let name = user_name else {
return
}
隱式解析可選類型
有時候在程序架構(gòu)中,第一次被賦值之后,可以確定一個可選類型總會有值。在這種情況下,每次訪問時都不需要檢查和解析可選類型的值,因為可以安全的確定它總會有值。這種類型的可選狀態(tài)被定義為隱式解析可選類型(implicitly unwrapped optionals)。把想要用作可選的類型的后面的問號?改成感嘆號!來聲明一個隱式解析可選類型。
let user_name: String! = "user_name"
let default_name: String = user_name
一個隱式解析可選類型其實就是一個普通的可選類型,但是可以被當做非可選類型來使用,并不需要每次都使用解析來獲取可選值。你可以把隱式解析可選類型當做一個可以自動解析的可選類型。你要做的只是聲明的時候把感嘆號放到類型的結(jié)尾,而不是每次取值的時候在可選類型名字結(jié)尾放置一個!。如果一個變量之后可能變成nil的話請不要使用隱式解析可選類型。如果你需要在變量的生命周期中判斷是否是nil的話,請使用普通可選類型。