swift initの話 Must call a designated initializer of the superclass xxx
Swiftのエラー「Must call a designated initializer of the superclass xxxx」を解消した話です。
事象
SKSpriteNodeを継承したクラスを自分で作り、initializerを実装しようとしたところ、下記のエラーが発生。
Must call a designated initializer of the superclass 'SKSpriteNode’
override init() は実装していたし、super.init() はその中で呼んでいた。
原因
initializer には designated と convenience の2種類あり、その違いが分かってなかった。
エラー発生時に呼んでいたのは convenience の方で、エラーの内容は書いてあるそのままの意味・・・
対策
じゃあ自分で実装した initializer からどれを呼べばいいか。
Commandキーを押しながら親クラスをクリックして調べる。
public convenience init(texture: SKTexture?, size: CGSize)
public convenience init(texture: SKTexture?, normalMap: SKTexture?)
public convenience init(imageNamed name: String, normalMapped generateNormalMap: Bool)
public init(texture: SKTexture?, color: UIColor, size: CGSize)
public convenience init(texture: SKTexture?)
public convenience init(imageNamed name: String)
public convenience init(color: UIColor, size: CGSize)
これ → public init(texture: SKTexture?, color: UIColor, size: CGSize)
実装した initializer からこの init を呼んで、無事に解決。
余談
init の入力補完に出る候補を選択する際に、よく見たら「Designated Initializer」と書いてあった。
でもカーソル当てないと表示されないし、引数で選ぶだけじゃん?
ここまで読みます? いや読めって話ですね。