Swift SKPhysicsBody的快捷方便初始值设定项扩展

Swift SKPhysicsBody的快捷方便初始值设定项扩展,swift,sprite-kit,swift-extensions,Swift,Sprite Kit,Swift Extensions,我在运行时遇到了这个错误 extension SKPhysicsBody { /// anchorPoint version of init(rectangleOfSize:center:) convenience init(rectangleOfSize s: CGSize, withAnchorPoint anchorPoint: CGPoint) { var center = CGPoint() center.x = (s.width /

我在运行时遇到了这个错误

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'

我基本上想扩展
SKPhysicsBody
类,为其工厂方法提供一个方便的初始值设定项,正如@Cristik在评论中猜测的那样,这与和的根本问题相同:public
SKPhysicsBody
类是提供其实现的private
PKPhysicsBody
类的方便接口

在过去,这种方法严重依赖于Objective-C的行为-只要
ClassA
响应与
ClassB
相同的选择器,您就可以调用静态类型(源代码中声明给编译器的类型)为
ClassB
的指针上的任何选择器,即使运行时的实际对象实际上是
ClassA
的实例

Swift比ObjC对运行时类型的正确性要求更严格,所以仅“duck类型”是不够的。自iOS 9/OS X 10.11以来,SpriteKit有一些变通方法,允许
PKPhysicsBody
实例更好地伪装成
SKPhysicsBody
实例

但这些并不涵盖所有情况——特别是,它不会捕获(ObjC)
[SKPhysicsBody alloc]
返回
PKPhysicsBody
实例,这意味着在Swift中向
SKPhysicsBody
添加初始值设定项的任何尝试都将失败。(因为ObjC
alloc
/
init
过程在Swift中被简化为一个初始化器调用。)

我认为这是一个错误并推荐。



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

如何调用初始值设定项?
redBox.physicsBody=SKPhysicsBody(rectangleOfSize:redBox.frame.size,withAnchorPoint:redBox.anchorPoint)
我当前的解决方法是使用工厂方法
SKPhysicsBody.body with rectangleOfSize(:withAnchorPoint:)
返回物理实体。这完全感觉不到敏捷性,由于所有obj-c工厂都很好地映射到各自的init方法。似乎SKPhysicsBody是一个集群类,它的
alloc
方法返回一个私有
PKPhysicsBody
实例,该实例没有刚刚添加的
init
。我阅读了其他一些带有SKPhysicsBody扩展的SpriteKit项目,以方便地创建physic body,他们大多使用类方法创建一个主体并返回它,这是唯一整洁的方法吗?
// redBox is a typical SKSpriteNode()
redBox.physicsBody = SKPhysicsBody(rectangleOfSize: redBox.frame.size, withAnchorPoint: redBox.anchorPoint)