iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 25
0

鏈的多層連接

你可以透過連接多個可選鏈來在模型中深入的訪問屬性、方法以和下標。總而言之,多層可選鏈不會給返回的值添加多層的可選性。也就是說:

  • 如果您訪問的類型不是可選的,則由於可選的鏈接,它將變為可選的。
  • 如果您訪問的類型已經是可選的,則由於鏈接的原因,它將不會變得更加可選。

因此:

  • 如果你嘗試透過可選鏈取回一個 Int 值,就一定會返回 Int?,不論經過了多少層的可選鏈。
  • 相同的,如果你嘗試透過可選鏈訪問 Int?值,Int? 一定就是返回的類型,無論通過了多少層的可選鏈。

我們試著訪問昨天該範例的 Customer 中的 name 屬性,這裡一共使用了兩層可選鏈,以鏈接 store 和 customer 屬性,它們都是可選類型:

if let customerName = trade.store?.customer?.name {
    print("客戶名稱為\(customerName)")
} else {
    print("讀取不到客戶名稱。")
}

結果如下:
https://ithelp.ithome.com.tw/upload/images/20180113/20107701tP5U2TrnxR.png

因為 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

之後就能成功訪問客戶的資訊了:
https://ithelp.ithome.com.tw/upload/images/20180113/20107701A7feJHoalB.png

trade.store 的 customer 屬性賦值能夠成功,是因為 trade.store 的值目前包含了一個可用的 store 實例。


用可選返回值鏈接方法

上面的例子瞭解如何透過可選鏈的連接來獲取可選類型的屬性值,你還可以使用可選鏈來調用返回可選類型值的方法,並且如果需要的話可以繼續對方法的返回值進行鏈接。

我們下面使用可選鏈來調用 Customer 的 checkData() 方法。這個方法返回 String? 類型值。正如上面所說,通過可選鏈調用的方法的最終返回的類型還是 String?:

if let checkData = trade.store?.customer?.checkData() {
    print("用戶資訊:\(checkData)")
}

結果如下:
https://ithelp.ithome.com.tw/upload/images/20180113/20107701vg6PrbqQ48.png

如此以來原先無法訪問的屬性和方法都能訪問了,可選鏈都連接在一起了:
https://ithelp.ithome.com.tw/upload/images/20180113/20107701pPI6U4QbLR.png


上一篇
Day-24 Swift 語法(20) - 可選鏈 Optional Chaining
下一篇
Day-26 Swift 語法(22) - 錯誤處理 Error Handling
系列文
Swift 菜鳥的30天30

尚未有邦友留言

立即登入留言