你可以透過連接多個可選鏈來在模型中深入的訪問屬性、方法以和下標。總而言之,多層可選鏈不會給返回的值添加多層的可選性。也就是說:
因此:
我們試著訪問昨天該範例的 Customer 中的 name 屬性,這裡一共使用了兩層可選鏈,以鏈接 store 和 customer 屬性,它們都是可選類型:
if let customerName = trade.store?.customer?.name {
print("客戶名稱為\(customerName)")
} else {
print("讀取不到客戶名稱。")
}
結果如下:
因為 trade.store.customer 的值為 nil ,所以 trade.store?.customer?.name 的調用失敗。上面的栗子中,你想要取回的 name 屬性。它的類型為 String?。 trade.store?.customer?.name 的返回值自然也是 String?,即使對屬性的可選項來說已經通過了兩層可選鏈。
如果你設置一個 Customer 實例作為 trade.store?.customer?.name 的值,並且設置 Customer 的 name 屬性值,你就可以通過多層可選鏈訪問 name 屬性的值了:
let tradeCustomer = Customer()
tradeCustomer.name = "Jeremy"
tradeCustomer.phone = "0922334556"
trade.store?.customer = tradeCustomer
之後就能成功訪問客戶的資訊了:
trade.store 的 customer 屬性賦值能夠成功,是因為 trade.store 的值目前包含了一個可用的 store 實例。
上面的例子瞭解如何透過可選鏈的連接來獲取可選類型的屬性值,你還可以使用可選鏈來調用返回可選類型值的方法,並且如果需要的話可以繼續對方法的返回值進行鏈接。
我們下面使用可選鏈來調用 Customer 的 checkData() 方法。這個方法返回 String? 類型值。正如上面所說,通過可選鏈調用的方法的最終返回的類型還是 String?:
if let checkData = trade.store?.customer?.checkData() {
print("用戶資訊:\(checkData)")
}
結果如下:
如此以來原先無法訪問的屬性和方法都能訪問了,可選鏈都連接在一起了: