Swift 可選(Optionals)類型
Swift 的可選(Optional)類型,用于處理值缺失的情況??蛇x表示"那兒有一個(gè)值,并且它等于 x "或者"那兒沒(méi)有值"。
Swfit語(yǔ)言定義后綴?作為命名類型Optional的簡(jiǎn)寫,換句話說(shuō),以下兩種聲明是相等的:
var optionalInteger: Int? var optionalInteger: Optional<Int>
在這兩種情況下,變量optionalInteger都是可選整數(shù)類型。注意,在類型和?之間沒(méi)有空格。
Optional 是一個(gè)含有兩種情況的枚舉,None和Some(T),用來(lái)表示可能有或可能沒(méi)有值。任何類型都可以明確聲明為(或者隱式轉(zhuǎn)換)可選類型。當(dāng)聲明一個(gè)可選類型的時(shí)候,要確保用括號(hào)給?操作符一個(gè)合適的范圍。例如,聲明可選整數(shù)數(shù)組,應(yīng)該寫成(Int[])?;寫成Int[]?會(huì)報(bào)錯(cuò)。
當(dāng)你聲明一個(gè)可選變量或者可選屬性的時(shí)候沒(méi)有提供初始值,它的值會(huì)默認(rèn)為nil。
可選項(xiàng)遵照LogicValue協(xié)議,因此可以出現(xiàn)在布爾環(huán)境中。在這種情況下,如果可選類型T?包含類型為T的任何值(也就是說(shuō)它的值是Optional.Some(T)),這個(gè)可選類型等于true,反之為false。
如果一個(gè)可選類型的實(shí)例包含一個(gè)值,你可以用后綴操作符 !來(lái)訪問(wèn)這個(gè)值,如下所示:
optionalInteger = 42 optionalInteger! // 42
使用操作符!去獲取值為nil的可選變量會(huì)有運(yùn)行時(shí)錯(cuò)誤。
你可以用可選鏈接和可選綁定選擇性執(zhí)行可選表達(dá)式上的操作。如果值為nil,任何操作都不會(huì)執(zhí)行,也不會(huì)有運(yùn)行報(bào)錯(cuò)。
讓我們來(lái)詳細(xì)看下以下實(shí)例來(lái)了解 Swift 中可選類型的應(yīng)用:
import Cocoa var myString:String? = nil if myString != nil { print(myString) }else{ print("字符串為 nil") }
以上程序執(zhí)行結(jié)果為:
字符串為 nil
可選類型類似于Objective-C中指針的nil值,但是nil只對(duì)類(class)有用,而可選類型對(duì)所有的類型都可用,并且更安全。
強(qiáng)制解析
當(dāng)你確定可選類型確實(shí)包含值之后,你可以在可選的名字后面加一個(gè)感嘆號(hào)(!)來(lái)獲取值。這個(gè)感嘆號(hào)表示"我知道這個(gè)可選有值,請(qǐng)使用它。"這被稱為可選值的強(qiáng)制解析(forced unwrapping)。
實(shí)例如下:
import Cocoa var myString:String? myString = "Hello, Swift!" if myString != nil { print(myString) }else{ print("myString 值為 nil") }
以上程序執(zhí)行結(jié)果為:
Optional("Hello, Swift!")
強(qiáng)制解析可選值,使用感嘆號(hào)(!):
import Cocoa var myString:String? myString = "Hello, Swift!" if myString != nil { // 強(qiáng)制解析 print( myString! ) }else{ print("myString 值為 nil") }
以上程序執(zhí)行結(jié)果為:
Hello, Swift!
注意:
使用!
來(lái)獲取一個(gè)不存在的可選值會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。使用!
來(lái)強(qiáng)制解析值之前,一定要確定可選包含一個(gè)非nil
的值。
自動(dòng)解析
你可以在聲明可選變量時(shí)使用感嘆號(hào)(!)替換問(wèn)號(hào)(?)。這樣可選變量在使用時(shí)就不需要再加一個(gè)感嘆號(hào)(!)來(lái)獲取值,它會(huì)自動(dòng)解析。
實(shí)例如下:
import Cocoa var myString:String! myString = "Hello, Swift!" if myString != nil { print(myString) }else{ print("myString 值為 nil") }
以上程序執(zhí)行結(jié)果為:
Hello, Swift!
可選綁定
使用可選綁定(optional binding)來(lái)判斷可選類型是否包含值,如果包含就把值賦給一個(gè)臨時(shí)常量或者變量??蛇x綁定可以用在if和while語(yǔ)句中來(lái)對(duì)可選類型的值進(jìn)行判斷并把值賦給一個(gè)常量或者變量。
像下面這樣在if語(yǔ)句中寫一個(gè)可選綁定:
if let constantName = someOptional { statements }
讓我們來(lái)看下一個(gè)簡(jiǎn)單的可選綁定實(shí)例:
import Cocoa var myString:String? myString = "Hello, Swift!" if let yourString = myString { print("你的字符串值為 - \(yourString)") }else{ print("你的字符串沒(méi)有值") }
以上程序執(zhí)行結(jié)果為:
你的字符串值為 - Hello, Swift!
更多建議: