swift initの話 Must call a designated initializer of the superclass xxx

2023年9月23日

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」と書いてあった。

init 入力補完

でもカーソル当てないと表示されないし、引数で選ぶだけじゃん?

ここまで読みます? いや読めって話ですね。

 

広告

swift