Optional Chaining as an Alternative to Forced Unwrapping で説明されているように、オプショナル値のプロパティにアクセスするため、およびプロパティアクセスが成功するかを確認するためにオプショナルチェーンを利用することができます。

新しい Person インスタンスを生成するために、前に定義したクラスを使用して numberOfRoomsプロパティにアクセスを試みます。

let john = Person()
if let roomCount = john.residence?.numberOfRooms {
    print("John's residence has \(roomCount) room(s).")
} else {
    print("Unable to retrieve the number of rooms.")
}
// "Unable to retrieve the number of rooms." と出力

john.residence は nil であり、このオプショナルチェーンの呼び出しは前と同じように失敗します。

また、オプショナルチェーンでプロパティの値を設定することができます。

let someAddress = Address()
someAddress.buildingNumber = "29"
someAddress.street = "Acacia Road"
john.residence?.address = someAddress

この例では、john.residence は nil であるため、john.residence の address プロパティへの設定は失敗します。

代入はオプショナルチェーンの一部で、= 演算子の右側のコードは評価されません。前の例では、定数アクセスには副作用が無いため、someAddress が評価されていないことを確認するのは容易ではありません。以下のコードは同じような代入ですが、アドレスを生成するために関数を使用しています。= 演算子の右側が評価されたか確認できるように、値を返す前に関数は “Function was called” を出力します。

func createAddress() -> Address {
    print("Function was called.")

    let someAddress = Address()
    someAddress.buildingNumber = "29"
    someAddress.street = "Acacia Road"

    return someAddress
}
john.residence?.address = createAddress()

何も出力されていないため、関数 createAddress() が呼びだされていないと判断できます。


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.