概要
コンピューテッドプロパティに関して理解が曖昧(特にセッタ)だったので、備忘録として記事を書きました。
コンピューテッドプロパティとは?
コンピューテッドプロパティとは、自身で値を保持するストアドプロパティとは違って、自身で値を保持せずすでに存在するストアドプロパティ等から計算して値を返すプロパティです。
アクセスごとに値を計算し直すため、計算元との値の整合性が常に保たれるという性質があります。
定義方法
var hoge: Hoge {
get {
return // returnによって値を返す処理
}
set {
// 値を更新する処理
}
}
var プロパティ名: 型名と記述し、続けて{}内にget/setを記述することで定義できます。
getの定義は必須ですが、setは定義しなくても問題ありません。
var hoge: Hoge {
return // returnによって値を返す処理
}
setが存在しない場合にはgetと{}を省略して上記のように記述することができます。
ゲッタとは
var name: String = "Tanaka"
var greeting: String {
get {
return "Hello!\(name)"
}
}
ゲッタとは、他のストアドプロパティなどから値を取得し、計算結果を値として返却しています。
上記では、ストアドプロパティであるnameの値を取得し、結果をgreetingの値として返しています。
セッタとは
let pi = Double.pi
var radius: Double = 3
var area: Double {
get {
return radius * radius * pi
}
set {
radius = sqrt(newValue / pi)
}
}
セッタとは、代入された値をもとに他のストアドプロパティを更新する処理です。インスタンス化された後、別の値が代入されることでセッタの処理が走ります。
セッタ内では、newValueを介して代入される値にアクセスできます。この値を使用しセッタの実行後にゲッタがnewValueと同じ値を返せるようにします。
上記では、円の半径と面積の関係を記載しています。ゲッタでは半径によって面積が算出されそれをareaに返しています。
逆にセッタでは、代入された面積の値から半径を算出しその値をradiusにセットしています。
おわりに
簡単にですがコンピューテッドプロパティについてまとめてみました。
他言語のセッタとは役割が違くて初めは戸惑いましたが、おさらいすることで理解が深められました。
ここまで読んでいただきありがとうございました。