有没有一种方法可以将willSet参数添加到结构的实例变量?

问题描述

我正在尝试按照以下方式做些事情:

class MyCGPoint: CGPoint {
    override public x: CGFloat {
        willSet {
            
        }
    }
}

自然地,我发现类不能扩展Structs,所以我不确定如何将willSet方法附加到CGPoint中已经存在的x变量上

我愿意接受这种方法的替代方案。我尝试这样做的原因是,我可以在该willSet方法添加一个断点,并确定是什么导致我的SKSpriteNode的位置发生变化(即使物理体速度为0)

请参阅SKPhysicsBody moving even when velocity is 0,以了解我正在尝试使用此技术诊断的问题。

解决方法

您不需要继承struct(Swift不允许您这样做)。只需创建具有相同签名的自己的Point,以及一种从Point转换为CGPoint的方法。然后用新的Point替换实现中的CGPoint

struct MyPoint {
  var x: CGFloat {
    willSet {
    
    }
  }
  var y: CGFloat

  var cgPoint: CGPoint { CGPoint(x: x,y: y) }
}
,

由于您需要进行调试,因此可以use a watchpoint-[SKSpriteNode setPosition:]上的符号断点(尽管我没有对此进行测试),甚至可以SKSpriteNode上的扩展名为:

extension SKSpriteNode {
    open override var position: CGPoint {
        willSet {
            print("Position of \(self) will change to: \(newValue)")
            // Breakpoint here
        }
    }
}