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キーを押しながら親クラスをクリックして調べる。
publicconvenienceinit(texture: SKTexture?, size: CGSize)
publicconvenienceinit(texture: SKTexture?, normalMap: SKTexture?)
publicconvenienceinit(imageNamed name: String, normalMapped generateNormalMap: Bool)
publicinit(texture: SKTexture?, color: UIColor, size: CGSize)
publicconvenienceinit(texture: SKTexture?)
publicconvenienceinit(imageNamed name: String)
publicconvenienceinit(color: UIColor, size: CGSize)
これ → publicinit(texture: SKTexture?, color: UIColor, size: CGSize)
実装した initializer からこの init を呼んで、無事に解決。
余談
init の入力補完に出る候補を選択する際に、よく見たら「Designated Initializer」と書いてあった。
でもカーソル当てないと表示されないし、引数で選ぶだけじゃん?
ここまで読みます? いや読めって話ですね。