1. ホーム
  2. ios

[解決済み] Swift - スーパークラス SKSpriteNode の指定イニシャライザーを呼び出す必要がある エラー

2022-02-07 08:46:39

質問

このコードは最初のXCode 6 Betaでは動作していましたが、最新のBetaでは動作せず、次のようなエラーが発生します。 Must call a designated initializer of the superclass SKSpriteNode :

import SpriteKit

class Creature: SKSpriteNode {
  var isAlive:Bool = false {
    didSet {
        self.hidden = !isAlive
    }
  }
  var livingNeighbours:Int = 0

  init() {
    // throws: must call a designated initializer of the superclass SKSpriteNode
    super.init(imageNamed:"bubble") 
    self.hidden = true
  }

  init(texture: SKTexture!) {
    // throws: must call a designated initializer of the superclass SKSpriteNode
    super.init(texture: texture)
  }

  init(texture: SKTexture!, color: UIColor!, size: CGSize) {
    super.init(texture: texture, color: color, size: size)
  }
}

というように、このクラスは初期化されています。

let creature = Creature()
creature.anchorPoint = CGPoint(x: 0, y: 0)
creature.position = CGPoint(x: Int(posX), y: Int(posY))
self.addChild(creature)

このままでは行き詰まる。一番簡単な修理は何だろう?

どのように解決するのですか?

init(texture: SKTexture!, color: UIColor!, size: CGSize) はSKSpriteNodeクラスで唯一指定されたイニシャライザーで、残りはすべて便宜的なイニシャライザーなので、superを呼び出すことはできません。あなたのコードをこのように変更してください。

class Creature: SKSpriteNode {
    var isAlive:Bool = false {
        didSet {
            self.hidden = !isAlive
        }
    }
    var livingNeighbours:Int = 0

    init() {
        // super.init(imageNamed:"bubble") You can't do this because you are not calling a designated initializer.
        let texture = SKTexture(imageNamed: "bubble")
        super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
        self.hidden = true
    }

    init(texture: SKTexture!) {
        //super.init(texture: texture) You can't do this because you are not calling a designated initializer.
        super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
    }

    init(texture: SKTexture!, color: UIColor!, size: CGSize) {
        super.init(texture: texture, color: color, size: size)
    }
}

さらに私は、これらをすべて1つのイニシャライザーに統合します。