標籤:assert swift 斷言 可選類型 可選綁定
可選類型是什嗎?
首先看一個問題,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)")}
斷言
斷言其實與可選類型毫無干係,它的使用可以協助程式員比較容易的發現和定位錯誤,使用上也並不難,因此就放在第四章最後一併介紹了。
在Swift中,通過assert函數實現斷言,其中第一個參數為判斷條件,第二個參數為條件不滿足時的列印資訊。
let age = 20assert(age > 20, "你是成年人啦!")
如果斷言被觸發,將會強制結束程式,並輸出相關資訊:
assertion failed: 你是成年人啦!: file /Users/KT/Desktop/MyIOS/Swift練習/Swift——可選類型/Swift——可選類型/main.swift, line 45(lldb)
使用斷言非常簡單,但是合理的添加斷言,有助於定位和排除bug,是在使用Swift中的一個好習慣。
附Swift入門系列教程Swift入門(一)——基本文法Swift入門(二)——字元與字串Swift入門(三)——元組(Tuple)
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Swift入門(四)——可選類型(Optionals)與斷言(Assert)