可選在上一篇中,提到一個概念就是曖昧。它是一種可以讓程式介於「有值」、「沒有值」的中間狀態,這種對於未來描述的「可能性」正是可選的基本概念。
不過本篇有一個重點在於:可選鏈是什麼東西?為什麽要使用可選鏈呢?
以Swift起步走上的說法:
可選鏈(optional chaining)是一個可以存取或呼叫屬性(property)、方法(method)及下標(subscript)的過程。
稱其為可選(optional)是因為當前存取或呼叫的目標可能為空(nil),而多次存取或呼叫可以用點語法(dot syntax 即.)將其全部鏈結在一起,所以稱為鏈(chaining)。
也就是說可選鏈的主要邏輯,是與屬性、方法、下標有關,而稱為「可選」可能是因為它當前的屬性、方法、下標可能是「空的狀態」而觀其樣態,則像鏈條,所以就是Optional chaining稱之了。
可選鏈為什麼重要?
在表達程式的時候,我們假如遇到一個情況是:這個節點是可選值的時候,我們就可以以“?”來表示它。
強制解包與可選鏈?誰好誰比較不好?這個問題要視情況,但….
假若你標示強制解包“!”的那個程式如果是空的(nil)值的話,程式就會發生運轉上的錯誤。
但可選鏈則不會發生這樣的問題,假如為空,那它就只是單純傳回nil值而已。
不論可選鏈最後返回的屬性、方法或下標是不是可選型別的值,都是返回一個可選值,所以可以用來判斷這個可選鏈是否成功,有返回值是成功,返回nil則是失敗。
上面這個例子,首先舉出來的是一個陣列
我們可以看到something.first?.uppercase( ),重點是「first?」的解讀,就以本例來說,我們可以這樣說,因為我們不知道something這個陣列會不會是沒有東西,所以我們才加上“?”
但是很顯然的,這個實例裡面是有的,所以結果會是”ADAM”
不過,可選鏈的使用也可以變得複雜一點:
上述的例子,比較關鍵的地方,是在adam.married指派給Married( ),因為裡面是true,所以,在11行的地方:
adam.married?.answer,這個內容因為第9行指派answer為true後,所以它就有值了,為“true”。
The 100Days of Swift:
The nil coalescing operator unwraps an optional and returns the value inside if there is one. If there isn’t a value — if the optional was nil – then a default value is used instead. Either way, the result won’t be optional: it will either by the value from inside the optional or the default value used as a back up.
翻譯翻譯:
這個空值合併運算子(有點拗口)可以解包可選項(optional),以及回傳在裡面的值。
如果在程式的運算過程中,最後的可選項還是產出了nil值,那這個默認值就會取而代之。而無論如何,這個運算後的結果不會是可選的,它將通過可選內部的值或用作備份的默認值。
而Nil coalescing有個很重要的表達方式,就是在默認值(default value)前面加上??,這樣當最終我們程式跑出來的值是nil的時候,默認值就會出來擋刀了。
如下,”Nothing in it”就是我們這個案例的默認值:
鐵人賽