Swift入門(四)——可選類型(Optionals)與斷言(Assert)

來源:互聯網
上載者:User

標籤: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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.