Swift

Swift プロパティを監視する(willSet、didSet)

More than 1 year has passed since last update.

プロパティを監視するwillSet、didSetについて記載

標準的な書き方
willSetはプロパティの変更前に、didSetは変更後に呼ばれる

class Car {
    var type:String = "bike" {
        willSet {
            print("willSet type:" + type); //willSet type:bike
        }
        didSet {
            print("didSet type:" + type);  //didSet type:track
        }
    }
}

var obj:Car = Car()
obj.type = "track"

init 呼び出し時の変更では、willSet、didSetは呼ばれない

class Car {
    init() {
        type = "default"
        self.type = "track"
    }
    var type:String = "bike" {
        willSet {
            print("willSet type:" + type);  //
        }
        didSet {
            print("didSet type:" + type);  //
        }
    }
}
var obj = Car()

Dictionaryの中身も監視される(Arrayも)

//Dictionaryの中身も監視される
class Car {
    var partsStatus:Dictionary<String,String> = ["engine":"v8","tire":"bridgestone"]{
        willSet {
            print("willSet partsStatus"); //willSet partsStatus
        }
        didSet {
            print("didSet partsStatus"); //didSet partsStatus
        }
    }
}
var obj = Car()
obj.partsStatus.updateValue("v8", forKey: "engine")

オブジェクトの中身は監視されない

class Engine {
    var name = "v6"
}

class Car{
    var engine:Engine = Engine(){
        willSet{
            print("willSet engine.name:" + engine.name); //
        }
        didSet{
            print("didSet engine.name:" + engine.name); //
        }
    }
}
var obj = Car()
obj.engine.name = "v8"

以上