プロパティオブザーバは、プロパティ値の変更を監視して反応します。プロパティオブザーバは、新しい値がプロパティの現在値と同じであっても、プロパティ値が設定されるたびに呼び出されます。

遅延ストアドプロパティは別として、定義したストアドプロパティにプロパティオブザーバを追加することができます。サブクラス内でプロパティをオーバーライドすることで、(ストアドかコンピューテッドかを問わず)継承したプロパティにもプロパティオブザーバを追加することができます。プロパティのオーバーライドは Overriding で説明されています。

次に示すオブザーバの片方または両方を、プロパティに定義することができます。

  • willSet は、値が保管される直前に呼び出されます。
  • didSet は、新しい値が保管された直後に呼び出されます。

willSet オブザーバを実装した場合、定数パラメータとして新しいプロパティ値が渡されます。willSet 実装の一部としてこのパラメータに名前を指定することができます。実装内にパラメータ名と丸括弧を記述していない場合、デフォルトのパラメータ名 newValueでパラメータを利用できます。

同様に、didSet オブザーバを実装した場合、古いプロパティ値を持つ定数パラメータが渡されます。パラメータに名前を付けるか、デフォルトのパラメータ名 oldValue を利用することができます。didSet オブザーバ内でプロパティに値を代入する場合、設定されたばかりの値を、代入する新しい値が置き換えます。

NOTE

プロパティがサブクラスのイニシャライザで設定されるとき、スーパークラスのプロパティの willSet と didSet オブザーバが呼び出されます。

イニシャライザデリゲーションについての詳細な情報は、Initializer Delegation for Value Types と Initializer Delegation for Class Types を確認してください。

次は、動作する willSet と didSet の例です。次の例では、歩行中の歩数をトラックする新しいクラス StepCounter を定義しています。このクラスは、毎日の運動をトラックする歩数計やステップカウンターからの入力データが使用されています。

class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps

StepCounter クラスは Int 型の totalSteps プロパティを宣言しています。これはストアドプロパティで、willSet と didSet オブザーバがあります。

totalSteps の willSet と didSet オブザーバは、プロパティに新しい値が代入されたときに呼び出されます。新しい値が現在値と同じであってもそうなります。

この例の willSet オブザーバは、新しい値に newTotalSteps というパラメータ名を使用しています。この例では、設定されようとしている値を単に出力しています。

didSet オブザーバは、totalSteps の値が更新された後に呼び出されます。totalStepsの新しい値と古い値を比較しています。ステップ総数が増加している場合、進んだ歩数を示すメッセージが出力されます。didSet オブザーバには、古い値にパラメータ名を付けることはできず、代わりにデフォルト名の oldValue を使用します。

NOTE
オブザーバを持つプロパティを入出力パラメータとして関数に渡す場合、willSetdidSet のオブザーバが常に呼び出されます。これは、入出力パラメータのコピーイン・コピーアウトのメモリモデルによるものです。値は常に関数の最後でプロパティに書き戻されます。入出力パラメータの挙動についての詳細は、In-Out Parameters を確認してください。

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.