しめ鯖日記

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

Swiftの配列のappendでdidSetは呼ばれるか

実際に呼ばれているか

確認した所呼ばれていました。

class MyClass {
    var arr = [String]() {
        didSet {
            print("didSet") // appendでも呼ばれた
        }
    }
}

let myClass = MyClass()
myClass.arr.append("TEST")

なぜSwiftの配列のappendでdidSetが呼ばれるか

理由ですが、appendなどmutatingなメソッドは変数の再代入を行っているからな気がします。
実際にappendの前と後のメモリ番地が変わっていたのでおそらく再代入されています。

var arr = [String]()
print(unsafeAddressOf(arr)) // → 0x00007f7ffa51c3b0
arr.append("STRING")
print(unsafeAddressOf(arr)) // → 0x00007f7ffa44ad90