はじめに
前回の記事にプロパティのことを説明しました。
しかし、プロパティの分類の仕方がもう一つあるのでそれについて紹介します。
プロパティの分類
プロパティは、値を保持するストアドプロパティ
と、値を保持しないコンピューテッドプロパティ
があります。今回はその2つについて説明していきます。
ストアドプロパティ
以下のtateやyokoのプロパティは、ストアドプロパティです。
struct Area{
var tate=10
var yoko=10
}
var A_1=Area()//インスタンス化
var A_2=Area()//インスタンス化
A_1.tate=3
A_2.tate=7
print(A_1.tate)//3
print(A_2.tate)//7
ここで、プロパティの値が変更されるとき、変更前と変更後に値を監視する機能があります。
struct Area{
var tate=10{
willSet{
print("old numver=",self.tate)
}
didSet{
print("new number=",self.tate)
}
}
var yoko=10
}
var A_1=Area()
A_1.tate=3
//実行結果
//old numver=10
//new number=3
willSetの{}では、プロパティの変更前に実行されます。
didSetの{}では、プロパティの変更後に実行されます。
また、このような仕組みをプロパティオブザーバ
と言います。
コンピューテッドプロパティ
コンピューテッドプロパティは、プロパティを初期化せずに、なんらかの計算をして値を返すプロパティです。
そして、そのプロパティにアクセスするタイミングで、値を保存することができます。
ほとんど関数みたいなもんですね
struct Area{
var yoko=10
var tate:Int{
get{
return yoko
}
set{
self.yoko=newValue+2
}
}
}
var A_1=Area()
A_1.tate=9
print(A_1.tate)//11
プロパティに代入するときはset{}が呼び出されて、A_1.tateみたいに値にアクセスする時(代入する時以外)はget{}が呼び出されます。
A_1.tateでは9を代入しているのでSet{}が呼び出されます。
その時、9にアクセスするにはnewValueを用います。newValue=9です。
それがyokoに代入されるのでyoko=11になります。
最後に,A_1.tateにアクセスしているのでget{return yoko}が実行されます。
yoko=11なので実行結果は11になります。