我正在尝试为 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 中。
平板电脑:
[[UIStoryboard storyboardWithName:@"StoryboardPad" bundle:nil] instantiateViewControllerWithIdentifier:@"Browser"];
苹果手机:
[[UIStoryboard storyboardWithName:@"StoryboardPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"Browser"];
操作系统:
[[BrowserViewController alloc] initWithNibName:@"BrowserViewController" bundle:nil]
由于都是 Objective-C,我的一些控制器可以跨平台重用,而且我不喜欢每次需要视图控制器时都在代码中添加条件编译语句。此外,在一周中的不同日子在不同平台上工作时,知道您只需拨打电话就可以vc(@"Browser")
得到您所期望的结果,无论是在 iPad、iPhone 还是 MAC 上。这只是约定与配置的问题。