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 減りました。
count プロパティに値が代入される度に、willSet と didSet が呼ばれているのがわかります。
変更前と変更後が同じ値の時も実行されていますね。
以上、Swift のプロパティオブザーバーについてご説明しました。