使用编译器条件来控制委托实现?

时间:2011-12-16 16:51:39

标签: ios objective-c c-preprocessor preprocessor-directive

是否可以使用编译器指令来控制是否实现了特定的委托?

例如,在下面的代码中,如果我们定义了一个常量,我只想包含一个库:

#ifdef kShouldLoadFromCSV
#import "CHCSVParser.h"
#endif

@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate, CHCSVParserDelegate>{

如果kShouldLoadFromCSV未定义,我不想实施CHCSVParserDelegate。我已经尝试在接口声明中粘贴编译指令,但这不起作用。

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:3)

你可以这样做:

#if kShouldLoadFromCSV
    @interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate, CHCSVParserDelegate>{
#else
    @interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate>{
#endif

或者,如果你愿意,也许更难阅读,这是一个品味问题:

    @interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate
#if kShouldLoadFromCSV
      , CHCSVParserDelegate
#endif
>{

你必须记住预处理器不是语法识别的,它只会影响编译器的输入。

答案 1 :(得分:3)

提供另一种格式选项:

@interface MyAppDelegate : NSObject
#if kShouldLoadFromCSV
    <UIApplicationDelegate, UITabBarControllerDelegate, CHSVParserDelegate>
#else
    <UIApplicationDelegate, UITabBarControllerDelegate>
#endif
{
...
}

但正如你已经看到的那样,这完全是一种品味问题。我会使用类似下一个的东西,因为它更容易扩展它(例如想象你需要另一个条件类别......):

@interface MyAppDelegate : NSObject
<
    UIApplicationDelegate, UITabBarControllerDelegate
#if kShouldLoadFromCSV
    , CHCSVParserDelegate
#endif
> {
...
}

答案 2 :(得分:0)

您可以尝试以下内容:

@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate >{
#if kShouldLoadFromCSV
    , CHCSVParserDelegate
#endif
> {