Swift 5.1 (15) - 可選連接

級別: ★☆☆☆☆
標籤:「iOS」「Swift 」「可選連接」「多級可選」
做者: 沐靈洛
審校: QiShare團隊php


可選連接

可選連接:查詢和調用當前可能爲nil的可選項的屬性,方法和下標的過程。若當前optional包含值,則屬性,方法或下標調用成功;若optionalnil,則屬性,方法或下標調用會返回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

image

小編微信:可加並拉入《QiShare技術交流羣》。源碼分析

image

關注咱們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公衆號)post

推薦文章:
淺談編譯過程
深刻理解HTTPS 淺談 GPU 及 「App渲染流程」
iOS 查看及導出項目運行日誌
Flutter Platform Channel 使用與源碼分析
開發沒切圖怎麼辦?矢量圖標(iconFont)上手指南
DarkMode、WKWebView、蘋果登陸是否必須適配?
奇舞團安卓團隊——aTaller
奇舞週刊

相關文章
相關標籤/搜索