我想知道是否有办法简化以下内容(cat
是与NSUInteger
对应的enum
:
if((cat == enum_cat1) & self.cat1) ||
(cat == enum_cat2) & self.cat2) ||
(cat == enum_cat3) & self.cat3) ||
(cat == enum_cat4) & self.cat4))
基本上我有一个类别枚举和一堆与这些属性对应的布尔类属性。只要匹配cat
的属性为true,我希望整个if
语句为真。 必须有更好的方法来做到这一点。它是什么?
答案 0 :(得分:2)
为什么不使用位掩码:
production_release
然后测试:
typedef enum Category {
Category0 = 0 << 0,
Category1 = 1 << 0,
Category2 = 1 << 1,
Cagegory3 = 1 << 2
};
@interface SomeClass : NSObject
@property (assign) Category category;
...
@end
或:
if (self.category & Category1) {
// Do first thing
} else if ((self.category & Category2) || (self.category & Category3)) {
// Do second or third thing
}
像这样设置:
- (void)doCategory:(Category)category
{
if (self.category & category) {
// Do thing
}
}
请注意SomeClass *someClass = [SomeClass new];
someClass.category = Category1|Category3;
[someClass doCategory:Category3];
和&
之间的差异。
答案 1 :(得分:0)
您可以使用enum
语句或字典在switch
值和属性名称之间创建映射,然后获取属性名称并使用KVC检查其值。
NSDictionary * catToProp = @{ @enum_cat1 : @"cat1",
// etc.
};
NSString * propName = catToProp[@cat];
if( [[self valueForKey:propName] boolValue] ){
}
您也可以使用数组:
NSString * catToProp = { [enum_cat1] = @"cat1",
// etc.
};
利用C&#39; named initializers。