我正在使用Xcode 7 beta 2并关注raywenderlich.com的Breakout教程来学习SpriteKit。这是我尝试使用unarchiveFromFile加载GameScene时出现的错误。
GameScene.type没有名为unarchiveFromFile的成员。
以下是代码:
func didBeginContact(contact: SKPhysicsContact) {
// 1. Create local variables for two physics bodies
var firstBody: SKPhysicsBody
var secondBody: SKPhysicsBody
// 2. Assign the two physics bodies so that the one with the lower category is always stored in firstBody
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
firstBody = contact.bodyA
secondBody = contact.bodyB
} else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
// 3. react to the contact between ball and bottom
if firstBody.categoryBitMask == BallCategory && secondBody.categoryBitMask == BottomCategory {
//TODO: Replace the log statement with display of Game Over Scene
if let mainView = view {
let gameOverScene = GameOverScene.unarchiveFromFile("GameOverScene") as! GameOverScene
gameOverScene.gameWon = false
mainView.presentScene(gameOverScene)
}
}
}
答案 0 :(得分:5)
您应该使用{8}以上的init(fileNamed:)
初始化程序。例如:
if let gameOverScene = GameOverScene(fileNamed: "GameOverScene") {
// ...
}
重要的是要注意init(fileNamed:)
是SKNode
上的便利初始化者:
convenience init?(fileNamed filename: String)
因此,要GameOverScene
自动继承init(fileNamed:)
,GameOverScene
必须遵守 The Swift Programming Language: Initialisation 中的以下规则(特别是规则2):
假设您为在子类中引入的任何新属性提供默认值,则适用以下两个规则:
规则1 如果您的子类未定义任何指定的初始值设定项,则为 自动继承其所有超类指定的初始化器。
规则2 如果您的子类提供了所有子类的实现 超类指定初始化程序 - 通过按照继承它们 规则1,或通过提供自定义实现作为其一部分 定义 - 然后它自动继承所有的超类 便利初始化者。