您的位置:首页 > 移动开发 > Swift

Swift学习之可选链式调用

2016-01-19 16:32 531 查看

可选链式

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: