代码之家  ›  专栏  ›  技术社区  ›  Kent Liau

SKPhysicsBody的Swift便利初始值设定项扩展

  •  3
  • Kent Liau  · 技术社区  · 9 年前
    extension SKPhysicsBody {
    
        /// anchorPoint version of init(rectangleOfSize:center:)
        convenience init(rectangleOfSize s: CGSize, withAnchorPoint anchorPoint: CGPoint) {
            var center = CGPoint()
            center.x = (s.width / 2) - ( s.width * anchorPoint.x)
            center.y = (s.height / 2 ) - ( s.height * anchorPoint.y)
            self.init(rectangleOfSize: s, center: center)
        }
    
    }
    

    我在运行时遇到此错误

    -[PKPhysicsBody initWithRectangleOfSize:withAnchorPoint:]: unrecognized selector sent to instance 0x7f9b03c4fff0
    
    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[PKPhysicsBody initWithRectangleOfSize:withAnchorPoint:]: unrecognized selector sent to instance 0x7f9b03c4fff0'
    

    这就是我调用代码的方式

    // redBox is a typical SKSpriteNode()
    redBox.physicsBody = SKPhysicsBody(rectangleOfSize: redBox.frame.size, withAnchorPoint: redBox.anchorPoint)
    

    我基本上想扩展 SKPhysicsBody 类为其工厂方法提供方便的初始值设定项

    1 回复  |  直到 9 年前
        1
  •  7
  •   rickster    7 年前

    正如@Cristik在评论中猜测的那样,这与 this question this question :公众 SKPhysicsBody 类是一个方便的私有接口 PKPhysicsBody 提供其实现的类。

    过去,这种方法在很大程度上依赖于 "duck typing" Objective-C的行为,只要 ClassA 响应所有相同的选择器 ClassB ,您可以在静态类型(源代码中声明给编译器的类型)为 B类 ,即使运行时的实际对象实际上是 A类 .

    Swift在运行时类型正确性方面比ObjC更严格,因此仅“鸭子类型”是不够的。自iOS 9/OS X 10.11以来,SpriteKit有一些解决方案,允许 PK物理体 更好地伪装的实例 SKPhysicsBody公司 实例。

    但这些并没有涵盖所有的案例,尤其是,它并没有抓住(ObjC) [SKPhysicsBody alloc] 返回 PK物理体 实例,这意味着任何向 SKPhysicsBody公司 Swift将失败。(因为ObjC alloc / init 该过程在Swift中简化为一个初始值设定项调用。)

    我认为这是一个错误,建议 filing it with Apple .


    编辑/更新:在这个bug得到修复之前(已经一年多了),解决方法是将方便的“初始化器”改为类方法。(如果必须,也可以是一个全局函数,但……ewww。)