質問: 0; } return self; } ```
回答: Objective-Cのイニシャライザの中には、Swiftからオーバライドすることは無理、と言うものもあるのですが、ご掲載のようなイニシャライザの場合は、基本パターン通りでSwift側でオーバライドできます。ただ、その「基本パターン」をわかりやすくまとめてある記事は意外と見つからなかったので、以下に説明させていただきます。 ``` override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { //(Phase1)この範囲で新規に導入されたプロパティをすべて初期化する // この間は`self`を(直接・間接を問わず)使用するコードを書いてはいけない test = 0 //<-`test`が初期化式のないプロパティだとすると、この文は`super.init(...)`より先に実行する必要がある //... super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) //(Phase2)この範囲では`self`の使用を含めて初期化に必要な処理を記載できる //... } ``` (`test`は、上記のイニシャライザを持つサブクラス側で新たに導入されたインスタンスプロパティと言う想定です。) いくつかポイントを挙げておきます。 * Objective-Cでパターン化している`if( (self = [super initXxx...]) ) {...}`と言うif文による判定はSwiftでは必要ありません。無視して、`super.init(Xxx...)`だけ呼んでください。 * Swiftのイニシャライザの制約(このリンク先のTwo-Phase Initializationのあたりを参照してください、全部英語かつとてもわかりやすいとは言えませんが)により、新たに導入されたプロパティの初期化は`super.init(...)`を呼ぶ前に行っておく必要があります。 タグで[swift3]が指定されていましたが、上記事項は全てのバージョンのSwiftで共通事項です。 (コード例はSwift3用。) Swiftでは一つの(指定)イニシャライザをオーバライドすると、他のイニシャライザが自動継承されなくなりますので、上記のイニシャライザを正しくオーバライドすると、別問題が発生する可能性があります。「別問題」に関する質問が必要となった場合は、あらたな質問としてください。