次のように使用されるLLVM用のCプリプロセッサマクロを作成しようとしています:
vc(@"Browser")
次のように展開されます。
[[BrowserViewController alloc] initWithNibName:@"BrowserViewController" bundle:nil]
私が思いつくことができる最高のものは次のとおりです。
vc(Browser)
これは次のように実装されます。
#define vc(xibName) [[xibName ## ViewController alloc] initWithNibName:[NSString stringWithFormat:@"%@ViewController", @#xibName] bundle:nil]
Browser
ただし、これ自体 (文字列リテラル以外) がトークンのように見えるため、ユーザーにとっては混乱を招く可能性があります。@"Browser"
ユーザーがマクロを読む必要がなくても、意図が少し明確になります。
編集:
この背後にある動機は一見ばかげているように見えますが、私は iPhone、iPad、および OS X 用のアプリに取り組んでおり、Interface Builder でレイアウトされたビューでビュー コントローラーをインスタンス化する独自の方法があります。
iPad:
[[UIStoryboard storyboardWithName:@"StoryboardPad" bundle:nil] instantiateViewControllerWithIdentifier:@"Browser"];
iPhone:
[[UIStoryboard storyboardWithName:@"StoryboardPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"Browser"];
OS X:
[[BrowserViewController alloc] initWithNibName:@"BrowserViewController" bundle:nil]
すべてが Objective-C であるため、一部のコントローラーはプラットフォーム間で再利用されます。ビュー コントローラーが必要になるたびに条件付きコンパイル ステートメントをコードに散らかすのは好きではありません。さらに、異なる曜日に異なるプラットフォームで作業する場合vc(@"Browser")
、iPad、iPhone、または MAC のいずれであっても、電話をかけるだけで期待どおりの結果が得られることを知っておくと役立ちます。これは、規則と構成の問題にすぎません。