標籤:http nil 指標 方案 有一個 直接 master 研究 結構體
可選類型是什嗎?
首先看一個問題,Swift中String類型的變數有一個叫做toInt的方法,能夠把String類型變數轉換為Int類型變數。
var stringValue = "5"var intValue = stringValue.toInt();println("intvalue = \(intValue)")
執行以上方法後得到了奇怪的結果:
intvalue = Optional(5)
事實上,能夠發現,toInt方法的傳回值並非Int,而是Int?這是由於Swift提供了一種叫做“可選類型”(Optionals)的新類型。String和Int類型相應的可選類型各自是String?和Int?
由於並非每一個字串都能夠轉換為整數,也就是說在執行
var intValue = stringValue.toInt();
這句代碼的時候。並不知道intValue的詳細值。假設stringValue無法轉換為Int類型,那麼這裡的intValue的值為nil。
和OC不同的是,nil並非一個null 指標,也不僅僅限於物件類型,而表示隨意一個可選類型的變數的值缺失。
String?和Int?等可選類型的變數值均能夠為nil。比方執行下面代碼:
var stringValue = "53d"var intValue = stringValue.toInt();println("intvalue = \(intValue)")
得到的結果會是:
intvalue = nil
可選類型與隱式可選類型強制解鎖可選類型
假設想要使用轉換後的變數值。而不出現Optional(xxx)這樣奇怪的表示的話,能夠使用驚嘆號(!
)運算子。強制使用可選類型變數裡面的值。這在Swift裡面叫做強制解鎖(Forced unwrapping of the optional’s value)。
然而強制解鎖一個值為nil 的可選類型會導致執行時錯誤(runtime error)。因此,在使用驚嘆號(!
)運算子強制解鎖可選類型變數時。一定要確保可選類型變數的值不為nil。
下面的代碼詳細解釋了之前的概念:
var stringValue1 = "55"var stringValue2 = "5d"var intValueNotNil = stringValue1.toInt();var intValueNil = stringValue2.toInt();println("intvalue1 = \(intValueNotNil!)") //強制解鎖。正常執行println("intvalue2 = \(intValueNil!)") //強制解鎖,執行時錯誤。
須要再次提醒的是,執行時錯誤無法被編譯器發現。會導致app直接閃退。所以正確的強制解鎖方案應該例如以下:
let unknownValue:Int? = 3//let unknownValue:Int? = nilif unknownValue != nil{ println("value = \(unknownValue。)")}else{ println("value = \(unknownValue)") //不強制解鎖,直接列印nil}
另一點須要注意的是。可選類型在定義的時候必須賦初值。不能夠用類型標註的方式跳過賦初值。否則會產生編譯錯誤。
可選綁定
Swift是一門簡潔的語言,使用強制類型解鎖來擷取可選類型變數裡的值過於麻煩,是非常多人不願意使用的。因此,能夠通過可選綁定的方式來解鎖可選類型中的值。
let unknownValue:Int? = 3//let unknownValue:Int? = nilif var variable = unknownValue { println("variable = \(variable)")}
可選綁定的關鍵在於if推斷裡的指派陳述式。假設unknownValue的值為nil,if推斷不成立。假設unknownValue的值不為nil,那麼variable將會得到unknownValue解鎖後的值。因此在列印variable的時候不再須要使用驚嘆號(!
)運算子。
隱式解鎖可選類型
隱式解鎖可選類型簡稱隱式可選類型,是與可選類型相對的概念。它須要在原基礎類型後加上驚嘆號。比方下面代碼能夠定義一個隱式可選類型:
var implicitOptional:Int! = 3
隱式可選類型表示預設這個變數中一直有值(即不為nil)。使用隱式可選類型就賦予了Swift自己主動解鎖隱式可選類型的權利。不須要調用驚嘆號(!
)運算子就可以解鎖隱式可選類型。
var implicitOptional:Int! = 3if implicitOptional != nil{ println("implicitOptional = \(implicitOptional)")}
輸出結果:
implicitOptional = 3
須要注意的是,隱式可選類型事實上也是一種可選類型。也就是說,假設隱式可選類型的值為nil,依舊會觸發執行時錯誤(Runtime Error)。所以在使用隱式可選類型變數時,為了安全起見。還是應該用if語句進行推斷。
除了在後文介紹無主引用時提到的隱式可選類型的使用情境外,不建議使用隱式可選類型。直接用可選類型取代就可以
隱式可選綁定
隱式可選類型的可選綁定被稱為隱式可選綁定,和可選類型的可選綁定在使用上全然一致。
只是沒有必要細緻研究了。示範範例代碼例如以下:
var implicitOptional:Int! = nil//var implicitOptional:Int! = 3if var unknownImplicitOptional = implicitOptional{ println("implicitOptional = \(unknownImplicitOptional)")}
斷言
斷言事實上與可選類型毫無干係,它的使用能夠協助程式猿比較easy的發現和定位錯誤。使用上也並不難,因此就放在第四章最後一併介紹了。
在Swift中。通過assert函數實現斷言,當中第一個參數為推斷條件,第二個參數為條件不滿足時的資訊列印。
let age = 20assert(age > 20, "你是成年人啦!")
假設斷言被觸發。將會強制結束程式,並輸出相關資訊:
assertion failed: 你是成年人啦!: file /Users/KT/Desktop/MyIOS/Swift練習/Swift——可選類型/Swift——可選類型/main.swift, line 45(lldb)
使用斷言非常easy。可是合理的加入斷言,有助於定位和排除bug,是在使用Swift中的一個好習慣。
附錄查看完整專欄——《Swift輕鬆入門》
【Swift入門(一)——基本的文法】
【Swift入門(二)——字元與字串】
【Swift入門(三)——元組(Tuple)】
【Swift入門(四)——可選類型(Optionals)與斷言(Assert)】
【Swift入門(五)——數組(Array)】
【Swift入門(六)——字典(Dictionary)】
【Swift入門(七)——結構體(Struct)】
【Swift入門(八)——功能強大的求餘運算子】
【Swift入門(九)——String與Int、Double、Float等數字相互轉換】
【Swift入門(十)——循環參考、弱引用和無主引用】
【Swift入門(十一)——類型轉換與is、as操作】
【Swift入門(十二)——利用Extension加入逆序輸出字串方法】
Swift入門(四)——可選類型(Optionals)與斷言(Assert)