Objective-Cで、`self = [super init]`の次の一行を書き替えたら圧倒的に楽になった話

  • 6
    いいね
  • 6
    コメント
この記事は最終更新日から1年以上が経過しています。

既に行っておられる方には「なにをか言わんや」的な話ではあるけれど、swiftとの互換性のため、コンストラクターの定義が、 - (id) から、- (nonnull instancetype)に変わった(より正確には推奨になった)。

基本的には無いけど、コンストラクト失敗もあり得るよね?

ってな訳で、コンストラクターの書き方を- (nonnull instancetype)で書いてて、「これ、コンストラクト失敗したらどないすんねん」って思ったのがきっかけで、お約束な次の書き方

- (instancetype) init
{
    self = [super init]
    if (self) {
        // 変数の初期化など
    }

    return self;
} // end - (instancetype) init

の、if (self)if (!self)に書き替えてみた。
結果、

- (nonnull instancetype) init
{
    self = [super init];
    if (!self)
        @throw [NSException exceptionWithName:(以下略)];

    // 変数の初期化など

    return self;
} // end - (nonnull instancetype) init

という書き方になり、不具合があれば例外をthrow、本来の処理はそのままに、(本来処理中で例外が発生すれば、別途throw)と、コードが非常にロジカルにすっきり書ける事に気がついた。

も一つ嬉しい事に

このお陰で、インスタンス作成部分を必ず@try~@catchブロックで囲むようになり、いつどの様な例外処理をすべきかをより意識してコーディングできるようになるというメリットもある。
よろしければお試し下さい。