可选链式
一种在当前值可能为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()本身调用
{
}