クラスで定義するプロパティには、定数や変数として定義するStoredプロパティの他、関数を介して値をやり取りするComputedプロパティというものがある。
まずはComputedプロパティがどのようなものか、基本的なコードを見ながら学んでいこう。
class Circle { var radius:Double = 1.0 var area:Double { get { return radius * radius * Double.pi } set(menseki) { radius = sqrt(menseki / Double.pi) } } }
上記のCircleクラスは、半径radius(Storedプロパティ)と、面積area(Computedプロパティ)、二つのプロパティを持つクラスだ。
Computedプロパティ自身は値を持っておらず、外部から参照された場合はgetブロックで値を返し、外部から値を代入された場合はsetブロックが実行される。
それでは実際に、Circleクラスをインスタンス化して値を設定する例を見ていこう。
let myCircle = Circle() print("半径\(myCircle.radius)") print("面積\(myCircle.area)") // 半径1.0 // 面積3.141592653589793 myCircle.area *= 2 print("半径\(myCircle.radius)") print("面積\(myCircle.area)") // 半径1.4142135623730951 // 面積6.283185307179588 myCircle.radius = 3.0 print("半径\(myCircle.radius)") print("面積\(myCircle.area)") // 半径3.0 // 面積28.274333882308138
Computedプロパティの扱い方は通常のStoredプロパティと同じだ。
ただし内部的には先ほど定義したゲッター、セッターが動作しており、Computedプロパティ「area」への値の代入、値の参照は上記例の実行結果のとおりとなる。