位置:首頁 > 高級語言 > Swift教學 > Swift為可選鏈定義模型類

Swift為可選鏈定義模型類

為可選鏈定義模型類

你可以使用可選鏈來多層調用屬性,方法,和子腳本。這讓你可以利用它們之間的複雜模型來獲取更底層的屬性,並檢查是否可以成功獲取此類底層屬性。

後麵的代碼定義了四個將在後麵使用的模型類,其中包括多層可選鏈。這些類是由上麵的PersonResidence模型通過添加一個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?。這個方法檢查buildingNamebuildingNumber的屬性,如果buildingName有值則將其返回,或者如果buildingNumber有值則將其返回,再或如果冇有一個屬性有值,返回空。