可空鏈式呼叫是一種可以請求和呼叫屬性、方法及下標的過程,它的可空性體現於請求或呼叫的目標當前可能為空(nil)。如果可空的目標有值,那麼呼叫就會成功;如果選擇的目標為空(nil),那麼這種呼叫將返回空(nil)。多個連續的呼叫可以被鏈結在一起形成乙個呼叫鏈,如果其中任何乙個節點為空(nil)將導致整個鏈呼叫失敗。
通過在想呼叫非空的屬性、方法、或下標的可空值後面放乙個問號,可以定義乙個可空鏈。這一點很像在可空值後面放乙個嘆號(!)來強制展開其中值。它們的主要的區別在於當可空值為空時可空鏈式只是呼叫失敗,然而強制展開將會觸發執行時錯誤。
為了反映可空鏈式呼叫可以在空物件(nil)上呼叫,不論這個呼叫的屬性、方法、下標等返回的值是不是可空值,它的返回結果都是乙個可空值。你可以利用這個返回值來判斷你的可空鏈式呼叫是否呼叫成功,如果呼叫有返回值則說明呼叫成功,返回nil
則說明呼叫失敗。
特別地,可空鏈式呼叫的返回結果與原本的返回結果具有相同的型別,但是被包裝成了乙個可空型別值。當可空鏈式呼叫成功時,乙個本應該返回int
的型別的結果將會返回int?
型別。
class residenceclass person
let john = person()
// 下面這行**會報錯,因為john的residence是可空的,john被初始化後也沒有對residence賦值,隨意residence為nil
// john.residence! 會強制展開,residence又是空(nil),所以會造成執行時錯誤
let roomcount = john.residence!.numberofrooms
class residenceclass person
let john = person()
if let roomcount = john.residence?.numberofrooms else
通過使用可空鏈式呼叫可以呼叫多層屬性,方法,和下標。這樣可以通過各種模型向下訪問各種子屬性。並且判斷能否訪問子屬性的屬性,方法或下標。
class person
class residencesubscript (index: int) -> room
set
}func printnumberofrooms()
var address: address?
}
class room}
class address else if buildingnumber != nil else}}
let john = person()if let roomcount = john.residence?.numberofrooms else
let someaddress = address()
someaddress.buildingnumber = "29"
someaddress.buildingname = "acacia road"
john.residence?.address = someaddress
// 因為john的residence屬性還是空,所以就算現在設定address也不會成功
print(john.residence?.address?.buildingname) // nil
func printnumberofrooms()
注意:這個方法沒有返回值。但是沒有返回值的方法隱式返回void
型別,這意味著沒有返回值的方法也會返回()或者空的元組。
如果在可空值上通過可空鏈式呼叫來呼叫這個方法,這個方法的返回型別為void?
,而不是void
,因為通過可空鏈式呼叫得到的返回值都是可空的。
let john = person()if john.residence?.printnumberofrooms() != nil else
同樣的,可以判斷通過可空鏈式呼叫來給屬性賦值是否成功。在上面的例子中,我們嘗試給john.residence
中的address
屬性賦值,即使residence
為nil
。通過可空鏈式呼叫給屬性賦值會返回void?。
let john = person()let someaddress = address()
someaddress.buildingnumber = "29"
someaddress.street = "acacia road"
john.residence?.address = someaddress
if (john.residence?.address = someaddress) != nil else
通過可空鏈式呼叫,我們可以用下標來對可空值進行讀取或寫入,並且判斷下標呼叫是否成功。
注意: 當通過可空鏈式呼叫訪問可空值的下標的時候,應該將問號放在下標方括號的前面而不是後面。可空鏈式呼叫的問號一般直接跟在可空表示式的後面。
let john = person()if let firstroomname = john.residence?[0].name else
// 列印: "unable to retrieve the first room name."
// 因為 john的residence屬性是空,所以訪問其下標肯定會返回空(nil)
// 當然 也可以通過可空鏈賦值,不過下面的**會賦值失敗,如果residence有值的話會成功
john.residence?[0] = room(name: "room1")
let john = person()let house = residence()
john.residence = house // 賦值residence屬性 現在該屬性有值了,不再是nil了
if let firstroomname = john.residence?[0].name else
// 列印出:the first room name is living room.
var testscores = ["d**e" : [86, 82, 84], "bev" : [79, 95, 81]]testscores["d**e"]?[0] = 91
testscores["bev"]?[0] += 1
if (testscores["brian"]?[0] = 99) != nil else
// 列印:"h**en't brian"
print("d**e's scores is \(testscores["d**e"]), bev's scores is \(testscores["bev"])")
// 列印:"d**e's scores is optional([91, 82, 84]), bev's scores is optional([80, 95, 81])"
可以通過多個鏈結多個可空鏈式呼叫來向下訪問屬性,方法以及下標。但是多層可空鏈式呼叫不會新增返回值的可空性。
也就是說:
因此:
let john = person()let house = residence()
john.residence = house
if let street = john.residence?.address?.street else
// 列印出:"unable to retrieve the address."
let john = person()let house = residence()
john.residence = house
let address = address()
address.buildingname = "the larches"
address.street = "laurel street"
john.residence?.address = address
if let street = john.residence?.address?.street else
// 列印:"john's street name is laurel street."
可以通過可空鏈式呼叫來呼叫返回可空值的方法,並且可以繼續對可空值進行鏈結。
let john = person()let house = residence()
john.residence = house // 賦值residence屬性 現在該屬性有值了,不再是nil了
let address = address()
address.buildingname = "the larches"
address.street = "laurel street"
john.residence?.address = address
if let identifier = john.residence?.address?.buildingidentifier()
// 通過可選鏈進一步訪問 因為buildingidentifier()返回的是string?,所以在buildingidentifier()後要加?
if let beginwiththe = john.residence?.address?.buildingidentifier()?.hasprefix("the") else
// 列印: "john's building identifier begins with "the"."
Swift 十七 可選鏈
1 swift入門學習筆記 第一版 對swift的基礎知識點進行梳理總結。知識點一直在變,只是作為參考,以蘋果官方文件為準 2 在學習完基本的知識點以後會結合官方文件及相關資料,在此版本的基礎上進行新增更改。1.1 可選型別使用時需要解包,解包時需要判斷是否為nil,常用if語句判斷,再去訪問其屬性...
Swift 可選鏈 備
在swift程式表示式中會看到問號 和感嘆號 它們代表什麼含義呢?這些符號都與可選型別和可選鏈相關,下面來看看可選鏈。可選鏈 類圖 它們之間是典型的關聯關係類圖。這些類一般都是實體類,實體類是系統中的人 事 物。employee通過dept屬性與department關聯,department通過co...
Swift學習筆記系列 (16)可選鏈
tags swift 學習筆記 可選鏈提供的是一種方便訪問可選型別值的途徑。可選鏈可以替代強制拆包的寫法,而且寫法可以更簡潔。可選鏈可以多級,直達你想要訪問的內容。可選鏈可以方法屬性 下標和方法。可選鏈返回的必定是乙個可選型別,返回nil則證明這條可選鏈中的某個環節是斷掉 其中有nil 的。用法 簡...