格納型プロパティ(Stored property)、計算型プロパティ(Computed property)についてメモ
###そもそもプロパティって
クラスや構造体、列挙体等で定義することができる定数/変数のこと。
###格納型プロパティ (Stored property)
struct ExampleStructure {
var Variable: Int
let Constant: String
}
インスタンスの一部として定数/変数を格納する。
※構造体定義で例示している理由は、クラスで上記を定義すると
初期化処理がないとエラーが吐かれる。
class ExampleClass {
var variable:Int
let constant: String
init(variable: Int, constatnt: String){
self.variable = variable
self.constant = constant
}
}
クラスだと上記のように定義するか、初めから初期値を設定する。
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が自分の中で消化できなかったので調べて書いてみました。
間違いや例示したものが適切でない等ありましたらどしどしご指摘ください。