Swift学习之可选链式调用

可选链式

一种在当前值可能为nil的可选值上调用属性、方法、下标的方法,如果可选值有值,则调用成功,否则就返回nil。多个调用可以连接在一起形成一条链,如果整条链的某个节点为nil,则调用不成功,返回nil。

class Person {
    var residence:Residence?
}
class Residence {
    var rooms = [Room]()
    var numberOfRooms:Int{
        return rooms.count
    }
    subscript(index:Int)->Room{
        get{
            return rooms[index]
        }

        set{
            rooms[index] = newValue
        }
    }
    func printNumberOfRooms(){
        print("The number of rooms is \(numberOfRooms)")
    }
    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
        }
    }
}


var iyaqi:Person = Person();
if let roomCount = iyaqi.residence?.rooms.count{
    print("\(iyaqi)'s rooms count is \(roomCount)")
}else{
    print("Unable to retrieve the number of rooms ")
}

let address = Address()
address.buildingNumber = "302"
address.buildingName = "451"
address.street = "明珠路"
iyaqi.residence?.address = address //nil.因为residence 为nil

var residence:Residence? = Residence()
iyaqi.residence = residence
iyaqi.residence?.address = address
print(iyaqi.residence?.address?.street) // Optional("明珠路")
iyaqi.residence?.rooms.append(Room(name:"302"))
iyaqi.residence?.numberOfRooms //1

iyaqi.residence?.printNumberOfRooms() //The number of rooms is 1

if let firstRoomName = iyaqi.residence?[0].name{
    print("iyaiq's first room name is \(firstRoomName)") //iyaiq's first room name is 302
}
iyaqi.residence?[0] = Room(name: "906")
print("iyaiq's first room name is \(iyaqi.residence?[0].name)") //iyaiq's first room name is Optional("906")

iyaqi.residence?.address?.buildingName //451

if let buildingId = iyaqi.residence?.address?.buildingIdentifier(){
    print("iyaqi's buildingIdentifier is \(buildingId)") //iyaqi's buildingIdentifier is 451
}

if let prefix = iyaqi.residence?.address?.buildingIdentifier()?.hasPrefix("3") //在buildingIdentifier()后面加个问号代表的是整个表达式的可选值上进行链式调用,而不是buildingIdentifier()本身调用
{

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值