Swift文件Chapter 16 可選鏈
阿新 • • 發佈:2022-01-24
可選鏈式呼叫是在當前值可能是nil
的情況下請求和呼叫屬性、方法以及下標的方法。
- 如果可選值有值,那麼呼叫成功;
- 如果可選值為
nil
,那麼呼叫返回nil
。多個呼叫連在一起形成呼叫鏈,任何一個節點為nil
,最終的結果都是nil
。
使用可選鏈式呼叫代替強制展開
在想要呼叫的屬性,方法或下標後加上?
就可以定義一個可選鏈。
為了能夠在可選鏈上返回空值nil
,不論這個屬性,方法或者下標返回值是不是可選值,返回結果都是可選值。可以對返回值判斷是不是nil
判斷是否呼叫成功。
可選鏈返回型別和原型別完全相同,只不過包裝成了可選值。
可選鏈式呼叫和強制展開的不同
我們定義:
class Person { var residence: Residence? } class Residence { var numberOfRooms = 1 }
其中,residence
屬性是可選的,如果我們定義了Person類的例項:
let john = Person()
那麼residence
屬性預設是nil.如果我們用!
訪問的話,會發生錯誤,因為這個屬性為nil
不能被強制展開。
let roomCount = john.residence!.numberOfRooms
//會發生錯誤
我們可以使用?
進行訪問:
if let roomCount = john.residence?.numberOfRooms { print("John's residence has \(roomCount) room(s).") } else { print("Unable to retrieve the number of rooms.") } // 列印“Unable to retrieve the number of rooms.”
此時,如果residence
不是nil
,那麼會訪問它的屬性並返回結果。當然,這個屬性也可能會訪問失敗,那麼返回值不再是Int
,而是Int?
。
通過可選鏈式呼叫訪問屬性
如果對於一個可選的屬性使用?
訪問後進行賦值,如果可以訪問,那麼會進行賦值。如果無法訪問,那麼等式右端的表示式失效。
通過可選鏈式呼叫來呼叫方法
對於方法來說,即使是一個沒有返回值Void
的函式,那麼返回的結果依然是Void?
,依然可以通過條件判斷是否為nil
。
通過可選鏈式呼叫訪問下標
下標訪問時,?
應當是放在中括號前面。如果下標不存在,那麼也會返回nil
.
對於Dictionary
型別,我們也可以使用可選鏈式訪問判斷一個鍵值是否存在。
連線多層可選鏈式呼叫
可以通過可選鏈訪問更深層的可選鏈。多層可選鏈式呼叫不會增加返回值的可選層級。
- 如果訪問值不可選,可選鏈式呼叫會讓返回值可選;
- 如果訪問值可選,可選鏈式呼叫會讓返回值“更可選”。如果返回值是
Int?
,那麼可選鏈式呼叫依然是Int?
,而不是Int??
。
在方法的可選返回值上進行可選鏈式呼叫
我們還可以在一個可選值上通過可選鏈式呼叫來呼叫方法,並且可以根據需要繼續在方法的可選返回值上進行可選鏈式呼叫。如果要在該方法的返回值上進行可選鏈式呼叫,在方法的圓括號後面加上問號即可。