Swift のプロパティオブザーバー willSet・didSet

ここでは Swift のプロパティオブザーバーについてご説明します。

Swift のプロパティオブザーバーの基本

Swift のプロパティオブザーバーを使うと、プロパティの値がセットされるたびに実行されるコードを指定することができます。

プロパティオブザーバーには willSet と didSet の二種類があります。

willSet はプロパティの値が変更される直前に呼ばれます。

didSet はプロパティの値が変更された直後に呼ばれます。


willSet と didSet の基本的な構文は以下の通りです。


var [プロパティ名]: [データ型] = [デフォルト値] {
    willSet {
        [プロパティの値が変更される直前に実行されるステートメント]
    }
    didSet {
        [プロパティの値が変更された直後に実行されるステートメント]
    }
}

willSet の中で、これから変更される値を使いたい時には newValue でアクセスできます。

もしくは willSet(newValueに代わるパラメタ名) { ... } のようにパラメタ名を指定して、その名前でアクセスすることもできます。


didSet の中で、変更前の値を使いたい時には oldValue でアクセスできます。

もしくは、willSet(oldValueに代わるパラメタ名) { ... } のようにパラメタ名を指定して、その名前でアクセスすることもできます。


また、プロパティオブザーバーは、プロパティに同じ値がセットされた時にも実行されます。


Swift のプロパティオブザーバーを使う

それでは、Swift のプロパティオブザーバーを使って、プロパティに値がセットされた時にコードを実行してみましょう。


次のような TestClass を定義します。

class TestClass {
    var count: Int = 0 {
        willSet {
            print("count は \(newValue) になります。")
        }
        didSet {
            print("変更前: \(oldValue) -> 変更後: \(self.count)")
            if oldValue == self.count {
                print("count は変更なしです。")
            } else if oldValue < self.count {
                print("count が \(self.count - oldValue) 増えました。")
            } else {
                print("count が \(oldValue - self.count) 減りました。")
            }
        }
    }
}

count という整数型のプロパティを初期値 0 で定義します。

willSet で、count の値が変更される前に ”count は \(newValue) になります。" を print してします。

didSet で、count の変更後に、変更前と変更後の値と、count がどのように変更されたかを print しています。


testClass のインスタンスを作って、count に値を代入し、print される文字列を確認してみます。

let testClass = TestClass()
testClass.count = 5
print("-----")
testClass.count = 20
print("-----")
testClass.count = 20
print("-----")
testClass.count = 8

実行結果は次のようになります。

count は 5 になります。
変更前: 0 -> 変更後: 5
count が 5 増えました。
-----
count は 20 になります。
変更前: 5 -> 変更後: 20
count が 15 増えました。
-----
count は 20 になります。
変更前: 20 -> 変更後: 20
count は変更なしです。
-----
count は 8 になります。
変更前: 20 -> 変更後: 8
count が 12 減りました。

Swift のプロパティオブザーバー willSet・didSet 1

count プロパティに値が代入される度に、willSet と didSet が呼ばれているのがわかります。

変更前と変更後が同じ値の時も実行されていますね。


以上、Swift のプロパティオブザーバーについてご説明しました。

© 2024 iOS 開発入門