为可选链定义模型类
你可以使用可选链来多层调用属性,方法,和子脚本。这让你可以利用它们之间的复杂模型来获取更底层的属性,并检查是否可以成功获取此类底层属性。
后面的代码定义了四个将在后面使用的模型类,其中包括多层可选链。这些类是由上面的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
有值则将其返回,再或如果没有一个属性有值,返回空。
易百教程移动端:请扫描本页面底部(右侧)二维码并关注微信公众号,回复:"教程" 选择相关教程阅读或直接访问:http://m.yiibai.com 。
加QQ群啦,易百教程官方技术学习群
注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。
- Java技术群: 227270512 (人数:2000,免费:否)
- Go开发者群(新): 851549018 (人数:1000,免费)
- PHP开发者群: 460153241 (人数:2000,免费)
- MySQL/SQL群: 418407075 (人数:2000,免费:否)
- 大数据开发群: 655154550 (人数:2000,免费:否)
- Python技术群: 287904175 (人数:2000,免费:否)
- 人工智能深度学习: 456236082 (人数:2000,免费:否)
- 测试工程师群: 415553199 (人数:2000,免费:否)
- 前端开发者群: 410430016 (人数:2000,免费:否)
- C/C++技术群(新): 629264796 (人数:2000,免费)
- Node.js技术群(新): 621549808 (人数:2000,免费)
- PostgreSQL数据库群: 539504187 (人数:1000,免费)
- Linux运维技术群: 479429477 (人数:2000,免费:否)
- Oracle数据库: 175248146 (人数:2000,免费:否)
- C#/ASP.Net开发者: 579821706 (人数:2000,免费)
- 数据分析师群: 397883996 (人数:2000,免费:否)