Swift入門(四)——可選類型(Optionals)與斷言(Assert)
可選類型是什麽?
首先看一個問題,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並非一個空指針,也不僅僅限於對象類型,而表示隨意一個可選類型的變量的值缺失。
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? = nil
if unknownValue != nil{
println("value = \(unknownValue。)")
}
else{
println("value = \(unknownValue)") //不強制解封,直接打印nil
}
另一點須要註意的是。可選類型在定義的時候必須賦初值。不能夠用類型標註的方式跳過賦初值。否則會產生編譯錯誤。
可選綁定
Swift是一門簡潔的語言,使用強制類型解封來獲取可選類型變量裏的值過於麻煩,是非常多人不願意使用的。因此,能夠通過可選綁定的方式來解封可選類型中的值。
let unknownValue:Int? = 3
//let unknownValue:Int? = nil
if var variable = unknownValue {
println("variable = \(variable)")
}
可選綁定的關鍵在於if推斷裏的賦值語句。假設unknownValue的值為nil,if推斷不成立。假設unknownValue的值不為nil,那麽variable將會得到unknownValue解封後的值。因此在打印variable的時候不再須要使用感嘆號(!
)運算符。
隱式解封可選類型
隱式解封可選類型簡稱隱式可選類型,是與可選類型相對的概念。它須要在原基礎類型後加上感嘆號。比方下面代碼能夠定義一個隱式可選類型:
var implicitOptional:Int! = 3
隱式可選類型表示默認這個變量中一直有值(即不為nil)。使用隱式可選類型就賦予了Swift自己主動解封隱式可選類型的權利。不須要調用感嘆號(!
)運算符就可以解封隱式可選類型。
var implicitOptional:Int! = 3
if implicitOptional != nil{
println("implicitOptional = \(implicitOptional)")
}
輸出結果:
implicitOptional = 3
須要註意的是,隱式可選類型事實上也是一種可選類型。也就是說,假設隱式可選類型的值為nil,依舊會觸發執行時錯誤(Runtime Error)。所以在使用隱式可選類型變量時,為了安全起見。還是應該用if語句進行推斷。
除了在後文介紹無主引用時提到的隱式可選類型的使用場景外,不建議使用隱式可選類型。直接用可選類型取代就可以
隱式可選綁定
隱式可選類型的可選綁定被稱為隱式可選綁定,和可選類型的可選綁定在使用上全然一致。
只是沒有必要細致研究了。演示樣例代碼例如以下:
var implicitOptional:Int! = nil
//var implicitOptional:Int! = 3
if var unknownImplicitOptional = implicitOptional{
println("implicitOptional = \(unknownImplicitOptional)")
}
斷言
斷言事實上與可選類型毫無幹系,它的使用能夠幫助程序猿比較easy的發現和定位錯誤。使用上也並不難,因此就放在第四章最後一並介紹了。
在Swift中。通過assert函數實現斷言,當中第一個參數為推斷條件,第二個參數為條件不滿足時的信息打印。
let age = 20
assert(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)