1

Objective-CからSwiftプログラミングに変更したとき、「 !」(感嘆符) と「 」(疑問符) が、呼び出しなどの?直後に置かなければならないことがよくあります。これらの記号は何に使用されますか?それらを使用しませんでしたか?propertymethod

ウェブで徹底的な答えを探しましたが、何も見つかりませんでした。そのため、誰かがその明確な答えを探している場合に備えて、ここに私の答えを載せることにしました.

また、私の回答の下に、私のものに似た質問へのリンクを含めました。ここでは、これらのマーク (「!」と「?」など) を使用する方法と場所に関する詳細な説明を見つけることができます。私の質問と私の回答は、リンクの同様の質問よりも基本的なレベルで説明しています。

4

2 に答える 2

1

これらのマークに使用される用語は ですOptional Chaining。それらは通常、ケースを区別するために使用さpropertymethod callますnil

Apple の言語ガイドでOptional Chaining説明されている例は、その使用目的を示すのに適しています。

Personまず、とという 2 つのクラスResidenceが定義されます。

class Person {
    var residence: Residence?
}

class Residence {
    var numberOfRooms = 1
} Residence instances have a single `Int` property called `numberOfRooms`, with a default value of **1**. `Person` instances

タイプ?のオプションのresidenceプロパティがあります。Residence

新しいPersonインスタンスを作成すると、オプションであるため、そのresidenceプロパティはデフォルトで に初期化さnilれます。以下のコードでjohnは、 のresidenceプロパティ値は次のnilとおりです。

let john = Person()

numberOfRoomsこの人物の のプロパティ にアクセスしようとする場合、その値のラップ解除を強制するために感嘆符を後にresidence配置すると、ラップを解除する値がないため、ランタイム エラーがトリガーされます。residenceresidence

let roomCount = john.residence!.numberOfRooms
// this triggers a runtime error

上記のコードは、値が nil 以外の場合に成功しjohn.residence適切な部屋数を含む値に設定さroomCountれます。ただし、上記のように、がの場合Int、このコードは常に実行時エラーを引き起こします。residencenil

オプションの連鎖は、 の値にアクセスする別の方法を提供します numberOfRoomsオプションの連鎖を使用するには、感嘆符の代わりに疑問符を使用します。

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

これは、Swift にオプションのプロパティで「<strong>チェーン」を指定し、存在する場合residenceの値を取得するように指示します。numberOfRoomsresidence

アクセスの試行numberOfRoomsは失敗する可能性があるため、オプションの連鎖試行は type の値Int?、つまり「<strong>optional Int」を返します。residenceがの場合nil、上記の例のように、このオプションIntも になりnil、 にアクセスできなかったという事実を反映しますnumberOfRooms。オプションInt のバインディングを介してオプションにアクセスし、整数をアンラップしてオプションではない値をroomCount変数に割り当てます。

numberOfRoomsはオプションではありませんが、これは真であることに注意してください Int。オプションのチェーンを介してクエリされるという事実は、 への呼び出しnumberOfRoomsが常にInt?ではなく を返すことを意味しIntます。

Residenceインスタンスをに割り当てて、値john.residenceを持たないようにすることができます。nil

john.residence = Residence()

上記の Optional Chaining の一般的な概要に加えて、StackOverflowでこの回答を見ることができます。

これにより、Optional Chaining についての見通しが得られることを願っています。

于 2016-05-20T09:21:49.280 に答える