0

我正在使用 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)
        }
    }
}
4

1 回答 1

5

您应该使用init(fileNamed:)从 iOS 8 开始提供的初始化程序。例如:

if let gameOverScene = GameOverScene(fileNamed: "GameOverScene") {
    // ...
}

重要的是要注意这init(fileNamed:)是一个方便的初始化器SKNode

convenience init?(fileNamed filename: String)

因此,为了GameOverScene自动继承init(fileNamed:)GameOverScene必须遵守The Swift Programming Language 中的以下规则:初始化(尤其是规则 2):

假设您为在子类中引入的任何新属性提供默认值,则适用以下两条规则:

规则 1如果你的子类没有定义任何指定的初始化器,它会自动继承它的所有超类的指定初始化器。

规则 2如果您的子类提供了其所有超类指定初始化器的实现(通过按照规则 1 继承它们,或者通过提供自定义实现作为其定义的一部分),那么它会自动继承所有超类便利初始化器。

于 2015-06-28T11:01:19.183 回答