iOS版。用指令替换方法调用?

时间:2013-11-26 09:12:18

标签: ios nsstring preprocessor directive

这只是一个例子:

#define Item1 @"1"
#define Item2 @"2"
...
#define Item10 @"10"

#define GeneralItem Item1

- (NSString *)generalItemID {

  if ([GeneralItem isEqualToString:Item1]) {

    return @"...";
  }
  if ([GeneralItem isEqualToString:Item2]) {

    ...
  }
  ...
}

是否可以在不编写自定义方法/函数的情况下将此代码替换为另一个代码?

这段代码看起来很糟糕,但这是因为同一个应用程序的多个版本。

已更新

我想用这样的方法替换generalItemID方法:

#define GeneralItemID ...

返回相同的结果

2 个答案:

答案 0 :(得分:0)

您可以使用两种方法为上述方法创建预处理器宏。如果您不需要在GeneralItem的特定实例上调用它,那么您可以将generalItemID方法设为类方法,然后可以使用以下宏:

#define GeneralItemID [GeneralItem generalItemID]

但是,我猜你需要在特定的实例上调用它,所以你可以使用下面的宏:

#define GeneralItemID(o) [o generalItemID]

将使用如下:

GeneralItem *genItem = [GeneralItem alloc] init];

NSString *itemID = GeneralItemID(genItem);

这应该做你要求的。但是,根据您的一些解释,这可能不是您正在寻找的方法。如果需要在多个对象中实现相同的功能,那么考虑将其余的对象设为GeneralItem的子类,并且它们将继承方法'generalItemID'。

答案 1 :(得分:0)

我目前的临时解决方案如下:

typedef enum {
  Item1,
  Item2,
  ...
  Item10
} Item;

#define GeneralItem Item1

@interface SomeClassWithConstants : NSObject

@property (nonatomic, retain readonly) NSString *item;

+ (SomeClassWithConstants *)sharedInstance; //singleton method

@end

@implementation

- (id)init {

  ...
  switch (GeneralItem) {

    case Item1:
    {
      item = @"1";
      break;
    }
    ...
  }
}

@end

此代码使用带有设置的单例而不是其他预处理器指令。但至少它保证只检查GeneralItem值一次。