如何将类属性与枚举匹配?

时间:2015-12-02 23:18:45

标签: ios objective-c

我想知道是否有办法简化以下内容(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语句为真。 必须有更好的方法来做到这一点。它是什么?

2 个答案:

答案 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