■はじめに
Swiftの入門書をやっていて、Computedプロパティの定義や書き方は掲載されているものの、具体的にどんな時にどんな目的で使うのか掲載されていませんでした。このままでは自分で開発する時に使えないので調べてみました。
■Computedプロパティとは
「Computedプロパティは、他のプロパティの値をもとに算出できてしまう場合や、プロパティにアクセスする直前に何かしらのチェックや計算が必要な場合に利用できる。」
※引用:【Swift】Computedプロパティの使い方。set、getメソッドの定義と省略 | はじはじアプリ体験記
「計算型プロパティ (Computed property)
決まった値を保持しておらず、インスタンスが生成される度に別プロパティから計算されて値を取得、設定されるプロパティでgetter/setterがある」
「変数に、値を代入した場合どういう動きをするのか、また値をどういう風に取得するのか、をそれぞれ定義するのが setter と getter の役割です。
値を代入した場合の動き : setter
どういう風に値を取得するのか : getter」
※引用:Stored property と Computed property - Qiita
「SwiftではGetterとかSetterは使わなくて良いんだけど、Computed Property という形で、アクセス時に値を加工したい場合などに使えるよ。」
※引用:SwiftでGetter(get), Setter(set)を使う方法 : (Computed Property) | Swift4 Web入門書
■わざわざComputedプロパティを使用する必要ないのでは?
上記記事を参考に理解を進めようとしたのですが、新たに疑問が生まれてしまいました。それは、「Computedプロパティを使わなくても、計算(値の加工)に関するプロパティやメソッドをそれぞれ記載しても同様の動作をするから、わざわざComputedプロパティを使用する必要ないのでは?」ということでした。
■理解するためのポイント2つ
・Computedプロパティは式を介して読み書きするだけでなく、リードオンリー/セットオンリーのプロパティが作れる、つまり読み書きを制御することができます。
・プロパティの参照や設定を行う際、使う側からはStoredプロパティなのか、Computedプロパティなのかはわかりません。
※参考:
[Swift] Property のベストプラクティスを考える - Qiita
Swiftスタートアップガイド - 掌田津耶乃 - Google ブックス
■どういうこと?
仮にクラスAにComputedプロパティが書かれているとしましょう。
クラスBがクラスAのComputedプロパティを参照しようとした時。
クラスBからはクラスAのComputedプロパティのget setの内容(どのような式が書かれているか)はわからないようになっています。
そのため、クラスBはComputedプロパティが実行する式の内容を書き換えることはできません。
つまり、Computedプロパティを使うことによって、外部から参照された時に、意図しない変更が加えられることを防ぐことができます。
逆に、Computedプロパティを使わず、計算(値の加工)に関するプロパティやメソッドを別々に記載したクラスCがあるとしましょう。
その後、クラスDとクラスEがそれぞれクラスCを呼び出して、それぞれがやりたいようにクラスCのプロパティの値を変更したら、もともとクラスCでやりたかった処理(計算)がくるってしまう可能性がありますね。
■おわりに
Computedプロパティは、オブジェクト指向におけるカプセル化や、アクセス権に関連する内容だということがわかりました。「どんな時に、どんな目的で」という観点で書かれている記事は少なかったので、少しでも誰かの参考になれば幸いです。
■関連リンク
・【Swift】Computedプロパティの使い方。set、getメソッドの定義と省略 | はじはじアプリ体験記
・ Stored property と Computed property - Qiita
・SwiftでGetter(get), Setter(set)を使う方法 : (Computed Property) | Swift4 Web入門書