くま's Tech系Blog

基本的には技術で学んだことを書き留めようと思います。雑談もやるかもね!

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
}

流れは今までみてきた例と同じですが、違いはsalarywillSet/didSetが定義されています。

willSetは値が変わる前の処理を書き、didSetは値が変わった後の処理を書きます。

どんなときに使うかというとdidSetは値が変更したらラベルを変更するなどで使うかもしれません。

willSetは使ったことがないのですが、変更前の値を別の変数で保存しておくなどが考えられます。

Comuputedプロパティとは少し違う話にはなってしまいますが、定義の下に処理がかけるのはComuputedプロパティと同じように見やすく使うこともあるかもしれないので、 参考になると幸いです。