LoginSignup
6
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-06-22

既に行っておられる方には「なにをか言わんや」的な話ではあるけれど、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ブロックで囲むようになり、いつどの様な例外処理をすべきかをより意識してコーディングできるようになるというメリットもある。
よろしければお試し下さい。

6
5
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5