しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

【Swift】didSetの呼ばれるタイミング(初期化/Struct/Classなどで検証)

SwiftのdidSetの呼ばれるタイミングを調べてみました。

didSetとは

プロパティーの値セットを検知する仕組みです。
下のように書くことで、プロパティーに値がセットされたタイミングを検知する事ができます。

class MainClass {
    var value: Int? {
        didSet {
            print("didSet")
        }
    }
}

didSetの呼ばれるタイミング

下のようにプロパティーを変更するとdidSetが呼ばれます。

class MainClass {
    var value: Int? {
        didSet {
            print("didSet")
        }
    }
}

let c = MainClass()
c.value = 0 // → didSetが呼ばれる

初期値をセットする時は呼ばれません。

class MainClass {
    var value: Int? = 0 { // 初期値を入れても呼ばれない
        didSet {
            print("didSet")
        }
    }
}

同じ値を連続で入れた場合、2回didSetが呼ばれます。

class MainClass {
    var value: Int? {
        didSet {
            print("didSet")
        }
    }
}

let c = MainClass()
c.value = 0
c.value = 0 // didSetが2回呼ばれる

少し複雑ややこしいのですが、Structのプロパティーを変更した時も呼ばれます。

struct MyStruct {
    var value = 0
}

class MainClass {
    var myStruct = MyStruct() {
        didSet {
            print("didSet")
        }
    }
}

let c = MainClass()
c.myStruct.value = 0 // didSetが呼ばれる

classの場合はdidSetが呼ばれません。

class MyClass {
    var value = 0
}

class MainClass {
    var myClass = MyClass() {
        didSet {
            print("didSet")
        }
    }
}

let c = MainClass()
c.myClass.value = 0 // didSetは呼ばれない