モデル内の深いレベルにあるプロパティやメソッド、サブスクリプトに掘り下げるために、オプショナルチェーンを複数つなげることができます。ですが、複数レベルのオプショナルチェーンが戻り値にさらにオプショナルのレベルを追加するわけではありません。

別の言い方をします。

  • 取り出そうとしている型がオプショナルではない場合、オプショナルチェーンによってオプショナルとなります。
  • 取り出そうとしている型がすでにオプショナルの場合、チェーンによってさらにオプショナルになることはありません。

従って、次のようになります。

  • オプショナルチェーンで Int 値を取り出そうとした場合、使用されたチェーンのレベルにかかわらず、常に Int? が返されます。
  • 同様に、オプショナルチェーンで Int? 値を取り出そうとした場合、使用されたチェーンのレベルにかかわらず、常に Int? が返されます。

次の例では、john の residence プロパティの address プロパティの street プロパティにアクセスしようとしています。ともにオプショナル型の residence と address プロパティをチェーンするために、2 レベルのオプショナルチェーンが使用されています。

if let johnsStreet = john.residence?.address?.street {
    print("John's street name is \(johnsStreet).")
} else {
    print("Unable to retrieve the address.")
}
// "Unable to retrieve the address." と出力

john.residence の値は有効な Residence インスタンスです。ですが、john.residence.address の値は nil です。このことから、john.residence?.address?.street の呼び出しは失敗します。

上の例では、street プロパティの値を取り出そうとしていることに注目してください。このプロパティの型は String? です。従って、そのプロパティのオプショナル型に加えて 2 レベルのオプショナルチェーンが適用されていますが、それでも john.residence?.address?.street の戻り値は String? です。

john.residence.address の値として Address インスタンスを設定し、アドレスの street プロパティに値を設定した場合、複数レベルのオプショナルチェーンで street プロパティの値にアクセスすることができます。

let johnsAddress = Address()
johnsAddress.buildingName = "The Larches"
johnsAddress.street = "Laurel Street"
john.residence?.address = johnsAddress

if let johnsStreet = john.residence?.address?.street {
    print("John's street name is \(johnsStreet).")
} else {
    print("Unable to retrieve the address.")
}
// "John's street name is Laurel Street." と出力

この例では、john.residence の値が有効な Residence インスタンスであるため、john.residence の address プロパティへの設定が成功しています。


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.