概要
プロジェクト内でAPIでUser型で取ってきた情報を取得してきて、ViewControllerのtableViewに表示するということをしました。ViewControllerに情報を反映させる前にUseCaseとPresenterにて、一時的にUser型の配列をバケツリレーのように参照してViewControllerに反映させました。その際に、getとsetを使ったので、復習を兼ねて調べようと思い記事にしてみました。
前提知識
getとsetを説明する前に、ストアドプロパティとコンピューテッドプロパティの違いについて知っておかなければなりません。
ストアドプロパティ
まず、ストアドプロパティとは、「変数や定数のように値を代入して保存するプロパティで、定義方法は、変数や定数と同様にvarキーワードやletキーワードを使用する。」と解説されています。
具体的に、コードに落とし込んでみると以下のようなもののことを指します。
/// ストアドプロパティ
var storedProperty = "StoredProperty"
変数「StoredProperty」を宣言し、その後にString型の文字列を代入しております。このように、単に変数に直接値を代入すると考えていただければと思います。
コンピューテッドプロパティ
一方、コンピューテッドプロパティとは、「プロパティ自身では値を保持せず、すでに存在するストアプロパティなどから計算して値を返すプロパティでアクセス毎に、値を計算し直すため計算元の値との整合性が常に保たれると言う性質がある。」と解説されています。そして、続けて「コンピューテッドプロパティを定義するには、varキーワードプロパティに続けて、プロパティ名と型を指定し、{}内にgetキーワードでゲッタを、setキーワードでせったを指定する。」とされています。初めてここで、getとsetが出てきますね。
get
getは文法書によると、「他のストアドプロパティなどから値を取得して、コンピューテッドプロパティの値として返す処理で、値の返却にはreturn文を用いる。」と解説されています。
要するに、getとは「直接変数に値を代入せずに、計算され終えたりした値を代入するために使われるもの」であるという認識でとりあえずいいと思います。
set
setとは、「プロパティに代入された値を使用して、他のストアドプロパティなどを更新する処理を行う。セッタ内では、暗黙的に宣言されたnewValueという定数を通じて代入された値にアクセスできる。この値を使用してセッタの実行後にゲッタがnewValueと同じ値を返せるようにインスタンスを更新する。」とされています。
セッタの省略
セッタの省略とは、「コンピューテッドプロパティではゲッタの定義が必須ですが、セッタの定義は任意で、セッタが存在しない場合は、getキーワードと{}を省略してゲッタを記述できる。」とされており、「セッタが定義されていないコンピューテッドプロパティでは、代入による値の更新ができなくなり、プロパティを更新するコードはコンパイルエラーとなる。」と解説されています。
何はともあれ、どんなものか見てみましょう。
var price = 100
/// コンピューテッドプロパティ
/// このように、直接値を変数に代入することはない。
var computedProperty {
get {
return price * 1.08
}
}
/// 108になるはず
print(computedProperty)
このように、コンピューテッドプロパティは、あらかじめ値を持たずに、他のプロパティ同士等で値を算出した後に、代入されることが多いみたいです。その際に、getキーワードとsetキーワードを用いることになります。
getおよび、コンピューテッドプロパティを用いることでインスタンスの管理がかなり簡単になったような気がしているので是非使ってみていただきたいなと思います。
さいごに
普段あまり考えずにとりあえず、使用している感があったので復習してみて新たらためてgetとsetの良さに気づけたかと思います。
W杯クロアチア戦、頑張って欲しいものです。
参照記事