2016-01-20 67 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) 
    } 

} 

我上運行斯威夫特方便初始化擴展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 questionthis question相同的根本問題:public SKPhysicsBody類是提供其實現的專用PKPhysicsBody類的便利接口。

在過去,這種做法嚴重依賴的Objective-C的"duck typing"行爲 - 只要ClassA響應都是一樣的選擇爲ClassB,你可以調用任何這些選擇的一個指針,其靜態類型(類型在源代碼中向編譯器聲明)爲ClassB,即使運行時的實際對象實際上是ClassA的實例。

與ObjC相比,Swift對運行時類型的正確性要求更嚴格,因此僅靠「鴨子打字」是不夠的。從iOS 9/OS X 10.11開始,SpriteKit有一些解決方法,允許PKPhysicsBody實例更好地假裝爲SKPhysicsBody實例。

但是,這些並不包括所有的情況下 - 特別是,它並沒有趕上(ObjC)[SKPhysicsBody alloc]返回PKPhysicsBody情況下,這意味着任何試圖初始化在斯威夫特添加到SKPhysicsBody將失敗。 (因爲ObjC alloc/init進程在Swift中減少爲一個初始化程序調用。)

我認爲這是一個錯誤並建議filing it with Apple


編輯/更新:而直到這個bug被固定的(它已經過了一年,現在某些產品),解決辦法就是讓你方便「初始化」到一個類方法來代替。 (或者,如果你必須的話,一個全局函數,但是... ewww。)