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