1 階層以上深いプロパティやメソッド、サブスクリプトの呼び出しにオプショナルチェーンを利用することができます。この機能により、相互関連のある型の複雑なモデル内にあるサブプロパティまで掘り下げ、サブプロパティのプロパティやメソッド、サブスクリプトにアクセスできるかどうかを確認することができます。
次のコードスニペットでは、複数階層にわたるオプショナルチェーンの例を含め、以降に続くいくつかの例で使用する 4 つのモデルクラスを定義しています。前に見た Person
と Residence
モデルに Room
と Address
クラスを追加し、関連するプロパティやメソッド、サブスクリプトを追加しています。
Person
クラスは以前と同じように定義されています。
class Person {
var residence: Residence?
}
Residence
クラスは以前よりも複雑です。今回は、Residence
クラスに変数プロパティ rooms
を定義し、[Room]
型の空配列で初期化しています。
class Residence {
var rooms = [Room]()
var numberOfRooms: Int {
return rooms.count
}
subscript(i: Int) -> Room {
get {
return rooms[i]
}
set {
rooms[i] = newValue
}
}
func printNumberOfRooms() {
print("The number of rooms is \(numberOfRooms)")
}
var address: Address?
}
このバージョンの Residence
は Room
インスタンスの配列を保持するため、numberOfRooms
プロパティはストアドプロパティではなく、コンピューテッドプロパティとして実装されています。コンピューテッドプロパティの numberOfRooms
は、単に rooms
配列から count
プロパティの値を返します。
このバージョンの Residence
は、rooms
配列にアクセスするショートカットとして、rooms
配列でリクエストしたインデックスにある部屋にアクセスする読み書き可能なサブスクリプトを持っています。
また、このバージョンの Residence
は printNumberOfRooms
メソッドを持ち、単にレジデンスの部屋数を出力します。
最後に、Residence
は Address?
型のオプショナルプロパティ address
を定義しています。このプロパティの Address
クラス型は、下で定義されています。
rooms
配列で使われている Room
クラスはシンプルなクラスで、name
プロパティと、そのプロパティを適切な部屋名に設定するイニシャライザがあります。
class Room {
let name: String
init(name: String) { self.name = name }
}
モデルの最後のクラスは、Address
です。このクラスには String?
型の 3 つのオプショナルプロパティがあります。初めの 2 つのプロパティ buildingName
と buildingNumber
は、住所の一部として特定の建物を識別する代替手段です。3 つ目のプロパティ street
は、住所のストリート名に使用されます。
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
}
}
}
また、Address
クラスは戻り値が String?
型の buildingIdentifier()
メソッドを持っています。このメソッドは住所のプロパティを確認し、buildingName
に値があればその値を返し、無い場合には、buildingNumber
と street
の両方に値があれば連結した値を返し、それらも無い場合には nil
を返します。
Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.