第十七章 可选链

强制解析!可选类型会引起运行时错误。采用可选?来解析,可选链是一个链式访问,逐层访问。

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 \(rooms.count)")

}

var address: Address?

}

class Room {

    var name: String

    init(name: String) {

        self.name = name

    }

}

class Address {

    var buildingName: String?

    var buildingNumber: String?

    var street: String?

    func buildingIdentifier() -> String? {

        if buildingName != nil {

            return buildingName

        } else if buildingNumber != nil && street != nil {

            return "\(buildingNumber) \(street)"

        } else {

            return nil

        }

    }

}

let john = Person()

if let residence = john.residence {

    print(residence.printNumberOfRooms())

}

if let address = john.residence?.address {

    if let addressID = address.buildingIdentifier() {

        print(addressID)

    } else {

        print("Unable to retrieve address identifier")

    }

 } else {

    print("Unable to retrieve the address.")

}

john.residence = Residence()

if let residence = john.residence {

    print(residence.printNumberOfRooms())

}

if let address = john.residence?.address {

    if let addressID = address.buildingIdentifier() {

        print(addressID)

    } else {

        print("Unable to retrieve address identifier")

    }

} else {

    print("Unable to retrieve the address.")

}

john.residence?.address = Address()

john.residence?.address?.buildingName = "AiDing Dasha"

if let building = john.residence?.address?.buildingIdentifier() {

    print(building)

}

john.residence?.rooms.append(Room(name: "Room 1001"))

john.residence?.rooms.append(Room(name: "Room 1002"))

john.residence?[0] = Room(name: "Room 2001")

if let room = john.residence?[0] {

    print(room.name)

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 可选链(Optional Chaining)是一种可以请求和调用属性、方法和子脚本的过程,用于请求或调用的目标可能...
    零度_不结冰阅读 2,372评论 0 0
  • 126.析构器 在一个类实例销毁前,一个析构器会立即调用。使用deinit 关键字来表示析构器, 跟构造器写法类似...
    无沣阅读 4,260评论 0 4
  • 可选链式调用是一种可以在当前值可能为nil的可选值上请求和调用属性、方法及下标的方法。如果可选值有值,那么调用就会...
    ishadowSR阅读 1,436评论 0 0
  • 看着你转身离开的背影 我想开口却只是无语 不知道应该说些什么 似乎释然和挽回都是错误 看着你转身离开的街道 霓虹不...
    幻梦邪魂阅读 2,669评论 0 2
  • 伴随着孩子的成长,时代的发展,以及物质生活水平的快速提高。追逐着不要让孩子输在起跑线上的焦虑,疲惫的穿梭于明目繁多...
    素朴之行阅读 1,709评论 0 0