Stored property と Computed property


格納型プロパティ(Stored property)、計算型プロパティ(Computed property)についてメモ

そもそもプロパティって


クラスや構造体、列挙体等で定義することができる定数/変数のこと。

格納型プロパティ (Stored property)


Structure
struct ExampleStructure {
    var Variable: Int
    let Constant: String
}

インスタンスの一部として定数/変数を格納する。
※構造体定義で例示している理由は、クラスで上記を定義すると

初期化処理がないとエラーが吐かれる。

Class
class ExampleClass {
    var variable:Int
    let constant: String

    init(variable: Int, constatnt: String){
        self.variable = variable
        self.constant = constant
    }
}

クラスだと上記のように定義するか、初めから初期値を設定する。

Class_2
class ExampleClass_2 {
    var variable = 10
    let constant = "Constant"
}

こんな感じ

計算型プロパティ (Computed property)


決まった値を保持しておらず、
インスタンスが生成される度に別プロパティから計算されて値を取得、設定されるプロパティで
getter/setterがある
※getterは単独で定義できるがsetterはgetterとセットでないと定義できない。

getter

class AreaOfTriangle {

    var base: Int
    var height: Int

    init(base: Int, height: Int) {
        self.base = base
        self.height = height
    }

    var triangle: Int {
        get{
            return base * height / 2
        }
    }
}

returnした値がtriangleに格納される。
ちなみにgetterのみの場合はget{}を省略できる。
getが読み込み専用というのはtriangleという変数そのものに値を代入(格納)することができないため。
アクセスすることしかできない。

setter

なぜかこのsetterがわかりづらかった。。。
インスタンス化された後computed propertyに別の値がセットされた時(値が代入された時)に呼ばれる。
※getはインスタンス化された時や、setによってgetで使っている値が変更された時に呼び出され、値が設定される。

class AreaOfTriangle {

    var base: Int
    var height: Int

    init(base: Int, height: Int) {
        self.base = base
        self.height = height
    }

    var triangle: Int {
        get {
            return base * height / 2
        }

        set(t) {
            base = t * 2
            height = t * 2
        }
    }
}

var a = AreaOfTriangle(base: 2,height: 2)
a.triangle = 5
print("\(a.base) , \(a.height)") //10 , 10

インスタンス化された後computed property(ここではtriangle)に別の値がセットされた時(値が代入された時)に呼ばれる。
※getはインスタンス化された時や、setによってgetで使っている値が変更された時に呼び出され、値が設定される。

動きとしては引数tに5が代入される。
そして以下のように、引数の代わりにnewValueを指定することもできる。

  set {
       base = newValue * 2
       height = newValue * 2
   }

まとめ


計算型プロパティのsetterが自分の中で消化できなかったので調べて書いてみました。
間違いや例示したものが適切でない等ありましたらどしどしご指摘ください。