Swift 可選類型
Swift 的可選(Optional)類型,用於處理值缺失的情況。可選表示"那兒有一個值,而且它等於 x "或"那兒沒有值"。
Swfit語言定義字尾?作為命名類型Optional的簡寫,換句話說,以下兩個聲明是相等的:
var optionalInteger: Int? var optionalInteger: Optional<Int>
在這兩種情況下,變數optionalInteger都是可選整數類型。注意,在類型和?之間沒有空格。
Optional 是一個含有兩種情況的枚舉,None和Some(T),用來表示可能有或可能沒有值。任何類型都可以明確聲明為(或隱式轉換)可選類型。當聲明一個可選類型的時候,要確保用括號給?操作符一個合適的範圍。例如,宣告可選整數數組,應該寫成(Int[])?;寫成Int[]?會報錯。
當你宣告一個可選變數或可選屬性的時候沒有提供初始值,它的值會預設為nil。
可選項遵照LogicValue協議,因此可以出現在布林環境中。在這種情況下,如果可選類型T?包含類型為T的任何值(也就是說它的值是Optional.Some(T)),這個可選類型等於true,反之為false。
如果一個可選類型的實例包含一個值,你可以用後綴運算子 !來存取這個值,如下所示:
optionalInteger = 42 optionalInteger! // 42
使用運算子!去取得值為nil的可選變數會有運行時錯誤。
你可以用可選連結和可選綁定選擇性執行可選表達式上的操作。如果值為nil,任何操作都不會執行,也不會有運行報錯。
讓我們來詳細看下以下實例來了解Swift 中可選類型的應用:
import Cocoa var myString:String? = nil if myString != nil { print(myString) }else{ print("字符串为 nil") }
以上程序執行結果為:
字符串为 nil
可選類型類似於Objective -C中指標的nil值,但是nil只對類別(class)有用,而可選類型對所有的類型都可用,並且更安全。
強制解析
當你確定可選型別確實包含值之後,你可以在可選的名字後面加上一個感嘆號(!)來取得值。這個感嘆號表示"我知道這個可選有值,請使用它。"這被稱為可選值的強制解析(forced unwrapping)。
實例如下:
import Cocoa var myString:String? myString = "Hello, Swift!" if myString != nil { print(myString) }else{ print("myString 值为 nil") }
以上程式執行結果為:
Optional("Hello, Swift!")
強制解析可選值,使用感嘆號(!):
import Cocoa var myString:String? myString = "Hello, Swift!" if myString != nil { // 强制解析 print( myString! ) }else{ print("myString 值为 nil") }
以上程序執行結果為:
Hello, Swift!
注意:
使用!
來取得一個不存在的可選值會導致執行時錯誤。在使用!
來強制解析值之前,請務必確定可選包含一個非nil
的值。
自動解析
你可以在宣告可選變數時使用感嘆號(!)取代問號(?)。這樣可選變數在使用時就不需要再加一個感嘆號(!)來取得值,它會自動解析。
實例如下:
import Cocoa var myString:String! myString = "Hello, Swift!" if myString != nil { print(myString) }else{ print("myString 值为 nil") }
以上程式執行結果為:
Hello, Swift!
可選綁定
使用可選綁定(optional binding)來判斷可選型別是否包含值,如果包含就把值賦給一個臨時常數或變數。可選綁定可以用在if和while語句中來對可選類型的值進行判斷並把值賦給一個常數或變數。
像下面這樣在if語句中寫一個可選綁定:
if let constantName = someOptional { statements }
讓我們來看下一個簡單的可選綁定實例:
import Cocoa var myString:String? myString = "Hello, Swift!" if let yourString = myString { print("你的字符串值为 - \(yourString)") }else{ print("你的字符串没有值") }
以上程序執行結果為:
你的字符串值为 - Hello, Swift!