クラスで定義するプロパティには、定数や変数として定義する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」への値の代入、値の参照は上記例の実行結果のとおりとなる。