Swift為可選鏈定義模型類
為可選鏈定義模型類
你可以使用可選鏈來多層調用屬性,方法,和子腳本。這讓你可以利用它們之間的複雜模型來獲取更底層的屬性,並檢查是否可以成功獲取此類底層屬性。
後麵的代碼定義了四個將在後麵使用的模型類,其中包括多層可選鏈。這些類是由上麵的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
有值則將其返回,再或如果冇有一個屬性有值,返回空。