Swift朝圣之路(二)

Optionals

這一塊在我剛剛看 Swift 的時候簡直是一臉懵逼,這回從頭學(xué)習(xí)的時候決定好好來研究一下,多做一些記錄。

我們先來看一段代碼:

NSString *string = nil;
if ([string rangeOfString:@"swift"].location != NSNotFound) {
     NSLog(@"this is a swift");
}

在上面的代碼中,這個 NSLog 實(shí)際上是會被打印出來的,但我們實(shí)際的上這個 string 對象明明就是一個 nil 但是依然被還是可以進(jìn)到if判斷中去,這就說明我們在實(shí)際的編程中設(shè)定的這種判斷值也不一定是百分之百的正確的。所以在 Swift 中引入了Optionals這么一個概念。

Optionals實(shí)際上是一個枚舉類型,里面有 SomeNone 兩種類型,在 Swift 中的 nil 就是表示為 Optionals.None,非 nil 就是 Optionals.Some(T)。

var demoString : String?
demoString = "this optional.some"
print(demoString)
輸出:"Optional("this optional.some")\n"

當(dāng)我們輸出 demoString 的時候系統(tǒng)雖然可以輸出內(nèi)容,但是會有個警告并且給了我們?nèi)N方式去修正這個 print(demoString) 這里我們先說第一種方式,后面再說其余的兩種方式,這里的第一種方式就是 print(demoString!) (Froce-unwarp the value to avoid this warning) 在后面加一個感嘆后,這種方式稱為 拆包 從Optionals.Some(T) 中取出這個 T 值。這個時候系統(tǒng)警告就會消失了并且輸出了"this optional.some\n",但是我們在對某個 Optional 值進(jìn)行拆包的時候一定要確保這個值是非 nil 的,不然編譯器會報(bào)錯。

我們還可以使用這種方法來判斷一個 Optional 的值是否有值

var demoString : String?
demoString = "Hello world..."

if let tempString = demoString {
    print("say \(tempString)")
} else {
    print("demoString is nil")
}

上面我們說到有三種方式去修正 print(demoString) ,現(xiàn)在我們說下第二種方式 (Provide a default value to avoid this warning)這里要引出我們的主角 ??,舉個例子

var demoString : String?
demoString = "this optional.some"
print(demoString ?? "default value")
輸出:"this optional.some\n"

那么其實(shí) ?? 也是一個三目運(yùn)算,其實(shí)就等同于

a == nil ? default Value : a!

判斷 a 是否是 nil 如果為 nil 就返回 default Value 那么如果不為 nil 就將 a 拆包后返回,那么關(guān)于這個 ?? 就先介紹這么多,后續(xù)再給出細(xì)致的解釋,就先深入到此。

關(guān)于 Optional 的介紹先到這里,如果后面我再對這個有新的理解的話再來增加內(nèi)容。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容