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