プロパティオブザーバは、プロパティ値の変更を監視して反応します。プロパティオブザーバは、新しい値がプロパティの現在値と同じであっても、プロパティ値が設定されるたびに呼び出されます。
遅延ストアドプロパティは別として、定義したストアドプロパティにプロパティオブザーバを追加することができます。サブクラス内でプロパティをオーバーライドすることで、(ストアドかコンピューテッドかを問わず)継承したプロパティにもプロパティオブザーバを追加することができます。プロパティのオーバーライドは Overriding で説明されています。
次に示すオブザーバの片方または両方を、プロパティに定義することができます。
willSet
は、値が保管される直前に呼び出されます。didSet
は、新しい値が保管された直後に呼び出されます。
willSet
オブザーバを実装した場合、定数パラメータとして新しいプロパティ値が渡されます。willSet
実装の一部としてこのパラメータに名前を指定することができます。実装内にパラメータ名と丸括弧を記述していない場合、デフォルトのパラメータ名 newValue
でパラメータを利用できます。
同様に、didSet
オブザーバを実装した場合、古いプロパティ値を持つ定数パラメータが渡されます。パラメータに名前を付けるか、デフォルトのパラメータ名 oldValue
を利用することができます。didSet
オブザーバ内でプロパティに値を代入する場合、設定されたばかりの値を、代入する新しい値が置き換えます。
プロパティがサブクラスのイニシャライザで設定されるとき、スーパークラスのプロパティの 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
を使用します。
willSet
と didSet
のオブザーバが常に呼び出されます。これは、入出力パラメータのコピーイン・コピーアウトのメモリモデルによるものです。値は常に関数の最後でプロパティに書き戻されます。入出力パラメータの挙動についての詳細は、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.