對於剛剛接觸 Swift 的你們來講, Optionals 這個概念可能會讓你們以爲有些陌生。這裏就簡單的和你們介紹一下 Swift 中的這個概念。php
對於使用 Objective-C 進行過開發的朋友來講,nil 這個值並不陌生。任何 Objective-C 中的變量,均可以賦值爲 nil,而且對值爲 nil 的對象調用方法,不會進行任何實際的操做。css
而在 Swift 中,nil 的含義和 Objective-C 中的有所不一樣。首先,Swift 中不管變量或是常量,都不能被賦予 nil。 它們必須有一個明確的初始值。html
若是將 nil 賦值給 Swift 變量,將會產生編譯錯誤:java
var str:String = nil
Expression does not conform to type ‘NilLiteralConvertible’nginx
也就是說,在 Swift 中,要使用一個變量必須爲它指定一個初始值。這也是 Swift 中的類型安全的一個體現。web
前面提到,在 Swift 中,咱們對變量不能指定 nil 值,但咱們定義變量時,並不必定總要進行初始化。還有,咱們的方法返回值,也不必定老是有具體值。這就引出 Swift 中變量定義的一點不方便了。canvas
這樣,Swift 又爲咱們提供了 Optional 類型。咱們能夠這樣理解它:Optional 類型變量的值是可選的(正如 Optional 類型的名稱所指示的)。它能夠包含具體的值,也能夠不包含具體的值(爲 nil 的值)。Optional 變量的定義方法以下:swift
var str:String? = nil
如上面代碼所示,咱們只須要在變量類型 String 後面添加一個問號 ?
, 就完成了 Optional 類型的定義。咱們若是編譯上面的代碼,就不會產生任何編譯錯誤,代碼順利的被編譯經過了。安全
由於 Optional 類型的變量能夠爲 nil 值,因此在使用它們的時候就須要進行判斷,在 Swift 中,若是直接使用值爲 nil 的變量,應用就會崩潰。因此咱們要進行必要的判斷。app
if str != nil {
print(str!)
} else {
print("str is nil")
}
咱們注意到,print(str!)
這行代碼,str變量的後面多了個歎號。這個歎號的意義咱們後面會介紹到,如今暫時將它忽略。
Optional Binding 是 Swift 中提供的一個用於判斷 Optional 類型是否爲 nil 的機制,它的語法以下:
if let constant = optionalVal {
statements
}
Optional Binding 應用於咱們以前定義的 str 變量,就是以下方式:
if let strVal = str {
print(strVal)
}else{
print("str is nil")
}
此次再仔細看看這個輸出語句 print(strVal)
, 是否是發現此次沒有歎號了。這就引出接下來要說的啦。
在 Swift 中,Optional 並非一個具體的類型,而是對類型的一個包裝。 好比 var str:String?
能夠理解爲,它並非一個 String 類型的變量,而是對 String 變量的一個包裝。
看看下面的代碼,就會更容易理解啦:
var strVal:String = 「swift string variable」
var strOptional:String? = 「swift」string optionals」
print(strVal)
print(strOptional!)
由於 strVal
是一個普通變量,因此咱們直接就能夠訪問到它所包含的值 print(strVal)
。而 strOptional
是一個 Optional 包裝過的變量,因此要訪問它所包含的值,就要對它進行拆包 print(strOptional!)
。這樣前面咱們一直在討論的歎號的做用就一目瞭然了吧。
還記得上面提到的 Optional Binding 嗎,這個語法規則會將 let
賦值的常量自動拆包,所以對於這個語法,就不須要顯示的使用歎號進行拆包了。
if let strVal = str {
print(strVal)
}else{
print("str is nil")
}
從上面的介紹不難看出,對 Optional 的值進行拆包須要繁瑣的使用 ! 語法。這樣的操做會很麻煩,尤爲是咱們已經確認知道某些變量不會是 nil 值的時候。
let strOptional:String? = 「An optional string.」
print(strOptional!)
let strImplictlyString:String! = 「An implictly optional string.」
print(strImplictlyString)
如上所示,聲明 隱式拆包的 Optional 只須要將變量定義結尾的 ? 改爲 ! 便可。對於這樣聲明的變量,在使用它的時候就再也不須要加 ! 了。
更多文章請訪問個人我的博客 www.theswiftworld.com