Comuputedプロパティについて
swiftは他の言語とは少し違い、基本的にはgetter/setterが必要ない言語です。
ただ、設定するときに値を加工したりする場合はComuputedプロパティ
というものがあります。(名前は最近知りました)
今回はそんなComuputedプロパティ
について説明しようかと思います。
Comuputedプロパティとは
Comuputedプロパティ
を説明する前に他の言語でのgetter/setterはこんな感じではないでしょうか??
例えば、Javaでは下記ですよね!
public class Product { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } public class Phone { Product p = new Product(); p.setName("携帯電話"); System.out.println(p.getName()); //携帯電話 }
このようにgetNameメソッド
とsetNameメソッド
を準備して、必要に応じて、値の取得と設定をメソッドを通じて行います。
つまり、決まった値を保持しておらず、インスタンスが生成される度に値を取得、設定することになります。
では、Swiftではどうでしょうか?
class Product { var companyName: String init(companyName) { self.companyName = companyName } var name:String { // 値を取得するときに呼ばれる get { return companyName } // 値を設定するときに呼ばれる set { companyName + "の携帯電話" } } } class Phone { let p = Product(); // setが呼ばれる p.name = "A社" // getが呼ばれる println(p.name) //A社の携帯電話 }
上記のnameプロパティ
に値を設定するときはset
、値を取得するときはget
が呼ばれます。
また、get
のみを記載すると読み取り専用のプロパティとなります。
上記のようにせず、別で取得用や設定用のメソッドを作れば同じ動きにすることはできますが、変数の定義を見るとすぐにgetter/setterが見れるのは個人的にわかりやすいと思います。
willSet/didSetについて
Swiftではget・set意外にwillSet/didSet
というものがあります。
どういものかみていきましょう!
class Staff { var salary: Int { willSet { print(salary)// 結果 1000 } didSet { print(salary)// 結果 1500 } } var worked: Int //働いた時間 init( _ salary: Int) { self.salary = salary } } class Resutaurant { let kuma = Staff(1000) kuma.salary = 1500 }
流れは今までみてきた例と同じですが、違いはsalary
にwillSet/didSet
が定義されています。
willSet
は値が変わる前の処理を書き、didSet
は値が変わった後の処理を書きます。
どんなときに使うかというとdidSet
は値が変更したらラベルを変更するなどで使うかもしれません。
willSet
は使ったことがないのですが、変更前の値を別の変数で保存しておくなどが考えられます。
Comuputedプロパティ
とは少し違う話にはなってしまいますが、定義の下に処理がかけるのはComuputedプロパティ
と同じように見やすく使うこともあるかもしれないので、
参考になると幸いです。