モデル内の深いレベルにあるプロパティやメソッド、サブスクリプトに掘り下げるために、オプショナルチェーンを複数つなげることができます。ですが、複数レベルのオプショナルチェーンが戻り値にさらにオプショナルのレベルを追加するわけではありません。
別の言い方をします。
- 取り出そうとしている型がオプショナルではない場合、オプショナルチェーンによってオプショナルとなります。
- 取り出そうとしている型がすでにオプショナルの場合、チェーンによってさらにオプショナルになることはありません。
従って、次のようになります。
- オプショナルチェーンで
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.