インライン関数でObjective-Cのメソッド名を短縮する【ダークサイドObjective-C】

Objective-Cはメソッド名が長くて格好良くないですよね。Objective-Cのカテゴリ機構を使えばメソッド名の短縮は可能ですが、パフォーマンスが落ちるため、私はインライン関数でのラップをオススメしています。オブジェクト指向らしさがなくなりますが、むしろメッセージ式([self that])だらけの殺伐としたObjective-Cコードにメリハリが付き、逆に読みやすくなります。

インライン関数化

NS_INLINE NSString *NSString_replaceAll(NSString *str, NSString *trg, NSString *rep) {
   return [str stringByReplacingOccurrencesOfString:trg withString:rep];
}
NS_INLINE NSArray *NSString_split(NSString *str, NSString *sep) {
   return [str componentsSeparatedByString:sep];
}

実行サンプル

// Before
for (id str in [@"f-o-o,b-a-r" componentsSeparatedByString:@","]) {
   NSLog(@"%@", [str stringByReplacingOccurrencesOfString:@"-" withString:@""]);
}
// After
for (id str in NSString_split(@"f-o-o,b-a-r", @",")) {
   NSLog(@"%@", NSString_replaceAll(str, @"-", @""));
}

インライン関数はコンパイル時にマクロと同等のインライン展開が行われますので、上記サンプル内// Afterのコードは// Beforeと同等のコードに置き換わります。またマクロと違い、コンパイラ側の型チェックや関数名重複のチェックもきちんと行われますので、非常にオススメのテクニックです。

関数化を行っておけば、以下のような仕様変更も一括で行えるようになります。

// もともとの仕様
NS_INLINE BOOL NSString_contains(NSString *str, NSString *trg) {
   return NSNotFound != [str rangeOfString:trg].location;
}
// オプションを追加して高速化(全ソースに反映される)
NS_INLINE BOOL NSString_contains(NSString *str, NSString *trg) {
   return NSNotFound != [str rangeOfString:trg options:NSLiteralSearch].location;
}

いろいろメリットが多いため今回のダークサイ度は星ゼロとします。

広告
広告