【问题标题】:Is there a way to add willSet parameter to a struct's instance variable?有没有办法将 willSet 参数添加到结构的实例变量?
【发布时间】:2020-08-20 22:05:43
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: swift sprite-kit


    【解决方案1】:

    因为你需要这个来调试你可以use a watchpoint-[SKSpriteNode setPosition:] 上的符号断点(虽然我没有测试过),甚至是SKSpriteNode 上的扩展,如下所示:

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

    【讨论】:

    • 嗯,我正在考虑接下来尝试这个,但是这样做的潜在缺点是如果违规代码直接修改 x 或 y,willSet 方法将不会执行。除非 CGPoint 是不可变的?
    • 我尝试了那个扩展,它至少确认无论是什么改变了 x/y 值,它都会直接改变它们(因为这个 willSet 在问题期间不执行,但在其他时候执行我知道我改变了位置变量)。有没有办法直接对 CGPoint 结构中的 x 或 y 变量执行此操作?我不确定如何在这里使用观察点,因为这需要我从一开始就放置一个断点,而我的问题是我没有放置断点的地方
    • @Furyvore 没关系。设置node.position.x = <some_value> 将触发wiiSet 观察者。你可以在操场上试一试。
    • 有趣,你是对的,willSet 无论如何都会触发。所以我们有一个位置值会在不改变位置参考的情况下发生变化,也不改变内部的 x/y 值..这怎么可能?
    • 如果你能提供一个 minimal 可重现的例子,我很乐意看看。
    【解决方案2】:

    你不需要子类化结构(Swift 不允许你这样做)。只需使用相同的签名创建您自己的 Point,以及从您的 Point 转换为 CGPoint 的方法。然后用新的 Point 替换你的实现中的CGPoint

    struct MyPoint {
      var x: CGFloat {
        willSet {
        
        }
      }
      var y: CGFloat
    
      var cgPoint: CGPoint { CGPoint(x: x, y: y) }
    }
    

    【讨论】:

    • 嗯,当你说“在你的实现中替换 CGPoint”时,有问题的实现是 SKSpriteNode.position,它不是“我的”,我也不能随意修改它。不过,这是否会与 Alladinian 的答案结合使用而不会导致其他事情中断?
    猜你喜欢
    • 2022-01-20
    • 2013-06-24
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多