这只是一个例子:
#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 ...
返回相同的结果
答案 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
值一次。