學習Swift 可選鏈

2022-09-17 10:30:12 字數 4923 閱讀 9068

可空鏈式呼叫是一種可以請求和呼叫屬性、方法及下標的過程,它的可空性體現於請求或呼叫的目標當前可能為空(nil)。如果可空的目標有值,那麼呼叫就會成功;如果選擇的目標為空(nil),那麼這種呼叫將返回空(nil)。多個連續的呼叫可以被鏈結在一起形成乙個呼叫鏈,如果其中任何乙個節點為空(nil)將導致整個鏈呼叫失敗。

通過在想呼叫非空的屬性、方法、或下標的可空值後面放乙個問號,可以定義乙個可空鏈。這一點很像在可空值後面放乙個嘆號(!)來強制展開其中值。它們的主要的區別在於當可空值為空時可空鏈式只是呼叫失敗,然而強制展開將會觸發執行時錯誤。

為了反映可空鏈式呼叫可以在空物件(nil)上呼叫,不論這個呼叫的屬性、方法、下標等返回的值是不是可空值,它的返回結果都是乙個可空值。你可以利用這個返回值來判斷你的可空鏈式呼叫是否呼叫成功,如果呼叫有返回值則說明呼叫成功,返回nil則說明呼叫失敗。

特別地,可空鏈式呼叫的返回結果與原本的返回結果具有相同的型別,但是被包裝成了乙個可空型別值。當可空鏈式呼叫成功時,乙個本應該返回int的型別的結果將會返回int?型別。

class residence 

class person

let john = person()

// 下面這行**會報錯,因為john的residence是可空的,john被初始化後也沒有對residence賦值,隨意residence為nil

// john.residence! 會強制展開,residence又是空(nil),所以會造成執行時錯誤

let roomcount = john.residence!.numberofrooms

class residence 

class person

let john = person()

if let roomcount = john.residence?.numberofrooms else

通過使用可空鏈式呼叫可以呼叫多層屬性,方法,和下標。這樣可以通過各種模型向下訪問各種子屬性。並且判斷能否訪問子屬性的屬性,方法或下標。

class person

class residence 

subscript (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屬性賦值,即使residencenil。通過可空鏈式呼叫給屬性賦值會返回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 的。用法 簡...