級別: ★☆☆☆☆
標籤:「iOS」「Swift 」「可選連接」「多級可選」
做者: 沐靈洛
審校: QiShare團隊php
可選連接:查詢和調用當前可能爲nil
的可選項的屬性,方法和下標的過程。若當前optional
包含值,則屬性,方法或下標調用成功;若optional
是nil
,則屬性,方法或下標調用會返回nil
。多個可選連接能夠鏈在一塊兒,若是鏈中的任何可選連接返回nil
,則整個鏈都會正常失敗。git
可選連接表示:在要調用屬性,方法或下標的可選項後放置?
。與可選項後放置!
進行強制解包類似,但主要區別在於使用?
時,當可選項爲nil
,連接便會返回nil
,來正常失敗;若爲!
,可選項爲nil
時,強制解包會觸發運行時錯誤。 即便要查詢的屬性,方法或下標返回的是非可選值,可選連接調用的結果也始終是可選的。github
class Person {
var residence: Residence?
}
class Residence {
var numberOfRooms = 1
}
let john = Person()
//`!`方式訪問屬性
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.")
}
複製代碼
定義模型類:編程
class Person {
var residence: Residence?
}
class Residence {
var rooms = [Room]()
var numberOfRooms: Int {
return rooms.count
}
subscript(i: Int) -> Room {
get {
return rooms[i]
}
set {
rooms[i] = newValue
}
}
func printNumberOfRooms() {
print("The number of rooms is \(numberOfRooms)")
}
var address: Address?
}
class Room {
let name: String
init(name: String) { self.name = name }
}
class Address {
var buildingName: String?
var buildingNumber: String?
var street: String?
func buildingIdentifier() -> String? {
if let buildingNumber = buildingNumber, let street = street {
return "\(buildingNumber) \(street)"
} else if buildingName != nil {
return buildingName
} else {
return nil
}
}
}
複製代碼
let john = Person()
if let roomCount = john.residence?.numberOfRooms {
print("John's residence has \(roomCount) room(s).")
} else {
print("Unable to retrieve the number of rooms.")
}
//賦值
let someAddress = Address()
someAddress.buildingNumber = "29"
someAddress.street = "Acacia Road"
john.residence?.address = someAddress
複製代碼
if john.residence?.printNumberOfRooms() != nil {
print("It was possible to print the number of rooms.")
} else {
print("It was not possible to print the number of rooms.")
}
複製代碼
if let firstRoomName = john.residence?[0].name {
print("The first room name is \(firstRoomName).")
} else {
print("Unable to retrieve the first room name.")
}
//賦值
john.residence?[0] = Room(name: "Bathroom")
複製代碼
var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]
testScores["Dave"]?[0] = 91
testScores["Bev"]?[0] += 1
testScores["Brian"]?[0] = 72
//調用後: "Dave" : [91, 82, 84] , "Bev": [80, 94, 81]
複製代碼
多級可選連接:將多個級別的可選連接連接在一塊兒。採用這種方式訪問和調用屬性,方法和下標時: 1.返回值不是可選的,也會由於可選連接而成爲可選類型。 2.返回值自己是可選的,不會由於可選連接變得更加可選。swift
if let johnsStreet = john.residence?.address?.street {
print("John's street name is \(johnsStreet).")
} else {
print("Unable to retrieve the address.")
}
複製代碼
####可選連接上有optional
類型的返回值的方法bash
if let buildingIdentifier = john.residence?.address?.buildingIdentifier() {
print("John's building identifier is \(buildingIdentifier).")
}
//方法的可選返回值後繼續調用
if let beginsWithThe = john.residence?.address?.buildingIdentifier()?.hasPrefix("The") {
if beginsWithThe {
print("John's building identifier begins with \"The\".")
} else {
print("John's building identifier does not begin with \"The\".")
}
}
複製代碼
參考資料: swift 5.1官方編程指南微信
瞭解更多iOS及相關新技術,請關注咱們的公衆號:ide
小編微信:可加並拉入《QiShare技術交流羣》。源碼分析
關注咱們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公衆號)post
推薦文章:
淺談編譯過程
深刻理解HTTPS 淺談 GPU 及 「App渲染流程」
iOS 查看及導出項目運行日誌
Flutter Platform Channel 使用與源碼分析
開發沒切圖怎麼辦?矢量圖標(iconFont)上手指南
DarkMode、WKWebView、蘋果登陸是否必須適配?
奇舞團安卓團隊——aTaller
奇舞週刊