1. 程式人生 > 其它 >Swift文件Chapter 16 可選鏈

Swift文件Chapter 16 可選鏈

可選鏈式呼叫是在當前值可能是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??

在方法的可選返回值上進行可選鏈式呼叫

我們還可以在一個可選值上通過可選鏈式呼叫來呼叫方法,並且可以根據需要繼續在方法的可選返回值上進行可選鏈式呼叫。如果要在該方法的返回值上進行可選鏈式呼叫,在方法的圓括號後面加上問號即可。