[Swift] 脱初心者 class initializer おさらい(3: failable initializer)

class initializer 説明の3回目です。複数の initializer を使い分けることが良いコードにつながります。
[Swift] 脱初心者 class initializer おさらい(1: designated initializer と convenience initializer) [Swift] 脱初心者 class initializer おさらい(2: クラス継承と required initializer)

initializer からのエラー

ここまで説明してきた initializer は、何らかのオブジェクトを生成することが前提でした。

しかし、場合によっては、オブジェクトを生成したくない/できないときもあるかもしれません。

そのようなケース向けに、nil を返すことができる initializer を定義することができます。

“failable initializer” と呼ばれます。 failable = “fail”(失敗) + “able”(できる)という命名になっている通り、失敗するかもしれない initializer です。

failable initializer

Initializer は、init( ) という名称を持つ必要があり、返り値は設定できません。ですので、failable initializer は、すこし特殊な定義方法となります。

failable initializer 例

定義としては、init? という名前の関数を定義することになります。意味的には、”init() -> Example?” 的な意味です。

このように定義することで、nil を返すことが可能です。

上記の例は、常に nil を返す initializer になっています。通常は、条件判定によって、返すことになります。

通常の initialize で nil を返せないかやってみます。

example code

このように、failable initializer でないと、nil を返せず、コンパイルエラーとなります。

designated initializer/ convenience initializer との関係

failable initializer は、designated initializer になれる?

なれます。例えば、以下のケースでは、1つの failable initailizer を designated initializer として定義しています。

example code

failable initializer は、convenience initializer になれる?

なれます。以下のケースでは、1つの failable initalizer を convenience initializer として定義しています。
初期化が必要な property がありますので、別途 designated initializer は必要となります。

example code

まとめ:initializer の種類まとめ

class initializer は、何種類かありますが、適材適所に使うことで、コードがレベルアップします。

class initializer の種類
default initializer
property が自動的に決められるときに、自動的に作成される
designated initializer
必ず呼ばれなければいけない、全ての property を初期化する initializer
convenience initializer
初期化方法を複数提供するための initializer、designated initializer を呼ばなければいけない
required initializer
継承した子クラスから override されなければいけないことを指定された initializer
failable initializer
オブジェクト生成でエラーが発生するかもしれない initializer

説明は以上です。
不明な点やおかしな点ありましたら、ご連絡いただけるとありがたいです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です