Option可选值可选值(二)

本文深入探讨了Swift编程中可选类型的使用方法,包括如何正确地进行强制拆包与安全拆包,以及如何利用可选链接来避免运行时错误。通过实例演示了在Person类中使用可选Residence属性的场景,并详细解释了如何处理可能出现的空指针问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//: Playground - noun: a place where people can play


import Cocoa


var str1 = "供选链接和强制拆包的不同。"

class Person {

    var residence: Residence?//供选连接

}

class Residence {

    var rooms = [Room]()

    var numberOfRooms: Int {

        return rooms.count

    }

    subscript(i: Int) -> Room {

        return rooms[i]

    }

    

    func printNumberOfRooms() {

        println("The number of rooms is \(numberOfRooms)")

    }

    

    var address: Address?

}

//如果你创建一个新的 Person 实例,它的 residence 属性由于是被定义为供选的,此属性将默认初始化为空:

//let john = Person()

/*

如果你想使用声明符!强制拆包获得这个人 residence 属性 numberOfRooms 属性值,将会引发运行时错误,因为这时没有可以供拆包的 residence 值。

*/

//let roomCount = john.residence!.numberOfRooms

//供选链接提供了一种另一种获得 numberOfRooms 的方法。利用供选链接,使用问号来代替原来!的位置:

//let roomCount = john.residence?.numberOfRooms

/*

if let roomCount = john.residence?.numberOfRooms {

    println("john's residence has \(roomCount) room(s).")

} else {

    println("Unable to retrieve the of rooms.")

}


john.residence = Residence()

if let roomCount = john.residence?.numberOfRooms {

    println("john's residence has \(roomCount) room(s).")

} else {

    println("Unable to retrieve the of rooms.")

}*/

/*

为供选链接定义模型类

这些类是由上面的 Person Residence 模型通过添加一个 Room 和一个 Address 类拓展来。

*/

class Room {

    let name: String

    init(name: String) {

        self.name = name

    }

}

class Address {

    var buildingName: String?

    var buildingNubmer: String?

    var street: String?

    

    func buildingIdentifier() -> String? {

        if (buildingName != nil) {

            return buildingName

        } else if (buildingNubmer != nil) {

            return buildingNubmer

        } else {

            return nil

        }

    }

}

//通过供选链接调用属性

let john = Person()

if let roomCount = john.residence?.numberOfRooms {

    println("John's residence has \(roomCount) room(s).")

} else {

    println("Unable to retrieve the number of rooms.")

}

//通过供选链接调用方法

var uu = 9

if(john.residence?.printNumberOfRooms() != nil) {

    println("It was possible to print the number of rooms.")

} else {

    println("It was not possible to print the number of rooms.")

}

//使用供选链接调用角标

if let firstRoomName = john.residence?[0].name {

    println("The first room name is \(firstRoomName).")

} else {

    println("Unable to retrieve the first room name.")

}




























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值