发布于 2015-06-14 01:47:53 | 183 次阅读 | 评论: 0 | 来源: 网络整理
你可以使用可选链来多层调用属性,方法,和子脚本。这让你可以利用它们之间的复杂模型来获取更底层的属性,并检查是否可以成功获取此类底层属性。
后面的代码定义了四个将在后面使用的模型类,其中包括多层可选链。这些类是由上面的Person
和Residence
模型通过添加一个Room
和一个Address
类拓展来。
Person
类定义与之前相同。
class Person {
var residence: Residence?
}
Residence
类比之前复杂些。这次,它定义了一个变量 rooms
,它被初始化为一个Room[]
类型的空数组:
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?
}
因为Residence
存储了一个Room
实例的数组,它的numberOfRooms
属性值不是一个固定的存储值,而是通过计算而来的。numberOfRooms
属性值是由返回rooms
数组的count
属性值得到的。
为了能快速访问rooms
数组,Residence
定义了一个只读的子脚本,通过插入数组的元素角标就可以成功调用。如果该角标存在,子脚本则将该元素返回。
Residence
中也提供了一个printNumberOfRooms
的方法,即简单的打印房间个数。
最后,Residence
定义了一个可选属性叫address
(address?
)。Address
类的属性将在后面定义。 用于rooms
数组的Room
类是一个很简单的类,它只有一个name
属性和一个设定room
名的初始化器。
class Room {
let name: String
init(name: String) { self.name = name }
}
这个模型中的最终类叫做Address
。它有三个类型是String?
的可选属性。前面两个可选属性buildingName
和 buildingNumber
作为地址的一部分,是定义某个建筑物的两种方式。第三个属性street
,用于命名地址的街道名:
class Address {
var buildingName: String?
var buildingNumber: String?
var street: String?
func buildingIdentifier() -> String? {
if buildingName {
return buildingName
} else if buildingNumber {
return buildingNumber
} else {
return nil
}
}
}
Address
类还提供了一个buildingIdentifier
的方法,它的返回值类型为String?
。这个方法检查buildingName
和buildingNumber
的属性,如果buildingName
有值则将其返回,或者如果buildingNumber
有值则将其返回,再或如果没有一个属性有值,返回空。