這一部分,主要講Swift中創新的可選型(optionals) 一、概要 可選型是Swift創新的一種新的類型,首先看一下可選型的應用場景: var errorCode : Int = 404 這時候errorCode的值是404,表示此時的錯誤狀態碼是404,當產生一種錯誤的時候就會獲得其對應的e ...
這一部分,主要講Swift中創新的可選型(optionals)
一、概要
可選型是Swift創新的一種新的類型,首先看一下可選型的應用場景:
var errorCode : Int = 404
這時候errorCode的值是404,表示此時的錯誤狀態碼是404,當產生一種錯誤的時候就會獲得其對應的errorCode,
但是如果沒有錯誤那應該怎麼辦呢?
在C/C++和Java中我們會給errorCode賦值為0或者是null(其實null也就是0),但是我們怎麼能夠保證0不是一種錯誤的狀態碼呢?
Swift為瞭解決這一問題,提供了可選型(optionals)當這個值不存在的時候,我們用nil表示,
需要註意的是:
var errorCode : Int = 404
errorCode = nil
這是錯誤的,因為nil是一種特殊的類型,是不可以賦值給int型的變數的。
正確的操作是:
var errorCode : Int? = 404
errorCode = nil
添加一個?就對了,這時候Int?表示的是整型的可選型
需要註意的是,可選型不可以賦值給不可選型的變數。
二、可選型的解包
在使用可選型的時候,需要進行解包操作,有兩種解包(unwrap)方式:
1)強制解包
var errorCode : Int? = 404
print(“The errorCode is”+errorCode!)
這種解包方式需要開發者保證errorCode的值不是nil,否則就會報錯。
2)if-let解包
var errorCode : Int? = 404
if let errorCode = errorCode {
print(“The errorCode is”+errorCode)
}
建議採用這種方式,當出現多個量需要解包的時候:
if let errorCode = errorCode,
errorMessage = errorMessage{
}
三、optional Chaining
先看看應用環境:
var errorMessage : String? = “Not Found”
if let errorMessage = errorMessage{
errorMessage.uppercaseString
}
這種方式是錯的,因為errorMessage是String而不是String?
如果要使用String的uppercaseString方法的話可以這樣做:
errorMessage?.uppercaseString
或者
errorMessage!.uppercaseString(確定不是nil)
這裡的返回類型也是一個可選型
如果errorMessage!.uppercaseString返回,再進行操作就類似一條chain。
四、nil coalesce
我們建議在聲明變數的時候就給變數賦初值,但有時候,我們希望通過後面的邏輯判斷之後再對變數進行賦值
這時候我們可以這樣做:
var errorMessage : String? = nil
let message = errorMessage == nil ? “Not Found” : errorMessage
當然可以通過nil coalesce方式
var errorMessage : String? = nil
let message = errorMessage??“Not Found”
五、元組的可選型
var error1 : (errorCode : Int?, errorMessage : String?) = (404, “Not Found”)
其中errorCode和errorMessage是可選型,但是error1不是可選型
因此errorCode和errorMessage可以是nil,而error1不可以
var error1 : (errorCode : Int?, errorMessage : String?)? = (404, “Not Found”)
errorCode和errorMessage,error1就都是可選型了
六、隱式可選型
主要應用在函數的構造函數中
var errorMessage : String! = nil
!進行使用的時候可以不進行解包操作,但是必須確保不為nil
在使用的時候,構造函數可以這樣定義,但是在後面會先賦值,再使用。