0

私は Xcode 7 beta 2 を使用しており、raywenderlich.com の Breakout チュートリアルに従って SpriteKit を学習しています。unarchiveFromFile を使用して GameScene を読み込もうとすると、次のエラーが表示されます。

GameScene.type には、una​​rchiveFromFile という名前のメンバーがありません。

コードは次のとおりです。

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)

したがって、 forGameOverSceneが を自動的に継承するinit(fileNamed:)に は、 Swift プログラミング言語GameOverSceneの次の規則に従う必要があります: 初期化(特に規則 2):

サブクラスに導入する新しいプロパティにデフォルト値を指定すると仮定すると、次の 2 つの規則が適用されます。

ルール 1サブクラスで指定された初期化子が定義されていない場合、サブクラスはそのスーパークラスの指定された初期化子をすべて自動的に継承します。

ルール 2サブクラスが、ルール 1 に従ってそれらを継承するか、定義の一部としてカスタム実装を提供することによって、そのスーパークラス指定イニシャライザーのすべての実装を提供する場合、スーパークラスのすべての便利なイニシャライザーを自動的に継承します。

于 2015-06-28T11:01:19.183 に答える