オプショナル値のサブスクリプトから値を取得、設定しようとするため、およびサブスクリプトの呼び出しが成功するかを確認するためにオプショナルチェーンを利用することができます。

NOTE
オプショナルチェーンでオプショナル値のサブスクリプトにアクセスするとき、サブスクリプトの角括弧の後ではなく、角括弧の前にクエスチョンマークを置きます。オプショナルチェーンのクエスチョンマークは、常にオプショナルである式の部分の直後に続けます。

次の例では、Residence クラスに定義されたサブスクリプトを使用して、john.residence プロパティの rooms 配列にある最初の部屋の名前を取り出そうとしています。john.residence は nil であるため、サブスクリプトの呼び出しは失敗します。

if let firstRoomName = john.residence?[0].name {
    print("The first room name is \(firstRoomName).")
} else {
    print("Unable to retrieve the first room name.")
}
// "Unable to retrieve the first room name." と出力

john.residence がオプショナルチェーンされるオプショナル値であるため、このサブスクリプトの呼び出しにあるオプショナルチェーンのクエスチョンマークは、サブスクリプトの角括弧の前で、john.residence の直後に置かれています。

同じようにして、オプショナルチェーンでサブスクリプトに新しい値を設定することができます。

john.residence?[0] = Room(name: "Bathroom")

residence は nil であるため、このサブスクリプトの設定も失敗します。

Residence インスタンスを生成して john.residence に代入し、rooms 配列に 1 以上の Room インスタンスを追加した場合には、オプショナルチェーンで Residence のサブスクリプトを使用して rooms 配列にある項目にアクセスすることができます。

let johnsHouse = Residence()
johnsHouse.rooms.append(Room(name: "Living Room"))
johnsHouse.rooms.append(Room(name: "Kitchen"))
john.residence = johnsHouse

if let firstRoomName = john.residence?[0].name {
    print("The first room name is \(firstRoomName).")
} else {
    print("Unable to retrieve the first room name.")
}
// "The first room name is Living Room." と出力

オプショナル型のサブスクリプトにアクセス

Swift の Dictionary 型のキーのサブスクリプトのように、サブスクリプトがオプショナル型の値を返す場合、オプショナルの戻り値をチェーンするためにサブスクリプトの閉じ角括弧の後にクエスチョンマークを置きます。

var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]
testScores["Dave"]?[0] = 91
testScores["Bev"]?[0] += 1
testScores["Brian"]?[0] = 72
// "Dave" 配列は [91, 82, 84] で、"Bev" 配列は [80, 94, 81]

この例では、String キーと Int 値の配列を対応させたキーバリュー 2 組を含む辞書 testScores を定義しています。オプショナルチェーンを利用して、"Dave" に対応する配列の最初の項目に 91 を設定し、"Bev" に対応する配列の最初の項目に 1 加算し、"Brian" のキーに対応する配列の最初の項目に設定しようとしています。辞書 testScores は "Dave" と "Bev" のキーを含んでいるため、初めの 2 つの呼び出しは成功しています。辞書 testScores には "Brian" のキーは含まれていないため、3 つ目の呼び出しは失敗しています。


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.