4

作成した構造体の監視対象プロパティで UnsafeMutablePointer を使用すると、予期しない動作が発生しました (Xcode 10.1、Swift 4.2)。次のプレイグラウンド コードを参照してください。

struct NormalThing {
    var anInt = 0
}

struct IntObservingThing {
    var anInt: Int = 0 {
        didSet {
            print("I was just set to \(anInt)")
        }
    }
}

var normalThing = NormalThing(anInt: 0)
var ptr = UnsafeMutablePointer(&normalThing.anInt)
ptr.pointee = 20
print(normalThing.anInt) // "20\n"

var intObservingThing = IntObservingThing(anInt: 0)
var otherPtr = UnsafeMutablePointer(&intObservingThing.anInt)
// "I was just set to 0."

otherPtr.pointee = 20
print(intObservingThing.anInt) // "0\n"

一見すると、UnsafeMutablePointer のポインティを監視対象のプロパティに変更しても、実際にはプロパティの値は変更されません。また、ポインターをプロパティに割り当てる操作によって、didSet アクションが起動されます。ここで何が欠けていますか?

4

2 に答える 2