プロパティについてのメモと、そこから引っ張ってComputedプロパティ(計算型プロパティ)のアクセサの必要性まで。
プロパティとはなんぞや?
クラスや構造体(structで定義するやつ)、列挙体(enumのやつ)で定義することができる定数・変数のこと。
いろいろ種類はあるが今回はこの2つの違いについてから。
格納型プロパティ(Stored property)
struct Example {
var A: Int
let B: String
}
インスタンスの一部として定数や変数を格納するプロパティ。
###[補足]インスタンスって何じゃい?
オブジェクト、インスタンス、クラスとカタカナ語がごちゃごちゃしますがまとめるとこんな感じです。
オブジェクト指向言語は仮想ワールドにいろんな登場人物(これをオブジェクトとかインスタンスって呼んでる)を登場させて、それぞれにプロパティとか関数(メソッド)とかをくっつけてそれぞれのインスタンス(オブジェクト)の属性や操作を決めていきます。
ちなみにオブジェクトはインスタンスだけではなくて、クラスのこともオブジェクトって呼ぶことがあるそうなのでオブジェクトって出てきたらクラスかインスタンスのどっちかの意味なんだろなと思ってもらえれば良いです。
これをコードで表すと以下。
class teacher {
let name:String
var hp:Int
init(name:String, hp:Int){
self.name = name
self.hp = hp
func teach() ->
func Shibaku() ->
func Kireru() ->
func Suneru() ->
}
}
※func 関数名 以下は適当です。
こんな感じでコードを書いてコンパイルすると、インスタンス(オブジェクト)が爆誕します。
で、話をプロパティに戻していくと、ここのnameやhpが格納型プロパティにあたり、上記のコードでは1番上のコードにはなかったinitと言う謎の文字を追加してありますが、これはイニシャライザと呼ばれ、クラスの属性を初期化しています。これをしないとエラーを出されてしまいます。
##計算型プロパティ(Computed property)
特定の値を持っておらず、クラスコードがコンパイルされてインスタンスが生成されるたびに他のプロパティから計算されて値を取得、設定されるプロパティです。
そしてこの「取得」には__getter__を「設定」には__setter__を使います。
具体例をみながら説明していきます。以下のコードを見てください。
class Circle {
var radius:Double = 1.0
var area:Double {
get {
return radius * radius * Double.pi
}
set(menseki) {
radius = sqrt(menseki / Double.pi)
}
}
}
上記のradiusプロパティは格納型プロパティで、areaがgetとset(getterとsetterがあるので)を持つので__計算型プロパティ__となっている。
ポイントはradiusの1.0のように値が格納されていない点で、以下のようにareaプロパティを呼び出すとgetの内容が実行されて出力される。
let myCircle = Circle()
print("面積\(myCirclearea)")
//面積3.141592653589793
radiusの値を変えておくとgetの中のradiusも変化するのでareaの値も変わる。
let myCircle = Circle()
myCircle.area = 3.0
print("面積\(myCirclearea)")
// 面積28.274333882308138
getterとsetterの存在価値
getterとsetterの存在価値は多く期は3つ。
#####メリット1:「読むだけしかできない」、「書き込むだけしかできない」フィールド(属性・操作を書く場所)
外部から自由に読めるようにしたいけど、変更されては困ると言うフィールドを作りたい場合に多用されるテクニック。
#####メリット2:フィールドの名前などクラスの内部設計を自由に変更できる
もし、上のareaをnewAreaに変更したくなった時、getter、setterを使っていないと他のフィールドのコードを全てname→newNameに変えなければならない。
だからget、setを挟むことで他のコードを変えなくて済む。
#####メリット3:フィールドへのアクセスの検査
setのなかに条件分岐文を用意することで変な値が書き込まれそうになったらエラーを出して弾くことができる。
##まとめ
自分の中でモヤモヤしていたものを調べてまとめてみました。
間違った内容などありましたらどしどしご指摘いただければ幸いです。