2016-01-20 5 views
3
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) 
    } 

} 

Я получил эту ошибку во время выполненияSwift удобство расширения инициализатор SKPhysicsBody

-[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 класс, чтобы обеспечить удобный инициализатор до его заводского метода

+0

Как вы называете инициализатор? – Cristik

+0

'redBox.physicsBody = SKPhysicsBody (rectangleOfSize: redBox.frame.size, withAnchorPoint: redBox.anchorPoint)' –

+0

В моем обходном методе используется метод фабрики 'SKPhysicsBody.bodyWithRectangleOfSize (: withAnchorPoint:)' для возврата тела физики. Это совершенно не так быстро, как и вся фабрика obj-c хорошо подходит для соответствующего метода init. –

ответ

7

Как @Cristik догадался в комментариях, это является той же самой корневой проблемой, что и this question и this question: общедоступный класс SKPhysicsBody - это удобный интерфейс для частного класса PKPhysicsBody, который обеспечивает его реализацию.

В прошлом, этот подход в значительной степени опирался на "duck typing" поведении Objective-C - до тех пор, как ClassA реагирует на все те же селекторы, как ClassB, вы можете вызвать любого из этих селекторов на указателе, статический типа (тип объявленный компилятору в исходном коде) равен ClassB, даже если фактический объект во время выполнения действительно является экземпляром ClassA.

Swift более строг относительно правильности времени выполнения, чем ObjC, поэтому недостаточно «утиного набора». Поскольку iOS 9/OS X 10.11, SpriteKit имеет некоторые обходные пути, которые позволяют PKPhysicsBody экземплярам, ​​чтобы лучше притворяться SKPhysicsBody экземплярами.

Но те, не охватывают все случаи - в частности, он не ловит (ObjC) [SKPhysicsBody alloc] возвращает PKPhysicsBody экземпляра, а это значит, любую попытку добавить инициализаторы к SKPhysicsBody в Swift потерпит неудачу. (Поскольку alloc/init процесс ObjC сводятся к одному инициализатору вызова в Swift.)

Я считаю, что это ошибка, и рекомендовать filing it with Apple.


Редактировать/обновление: А пока что ошибка не будет исправлена ​​(это был год, и некоторые из них сейчас), обходной путь, чтобы сделать ваше удобство «инициализатора» в метод класса вместо. (Или глобальная функция, если вам нужно, но ... ewww.)