是否有本机函数检查值是否在枚举内?

时间:2014-05-30 06:33:51

标签: objective-c enums

我正在尝试将UILabel放在NSDictionary内,我使用标签作为密钥,但问题是,并非所有视图内的标签都需要,所需的UILabel标签也在枚举内。

所以我想做的是,检查标签是否存在于枚举内部,然后将其添加到字典中,标签为关键字。

for (NSObject *obj in [self.formView subviews]) {

    if ([obj isKindOfClass:[UILabel class]]) {
        UILabel *label = (UILabel *)obj;

        // Here is where I want to add the check before I do this line
        labelDict[[NSString stringWithFormat:@"%d",label.tag]] = label;
    }
}

对于未来的读者:

如果您也在迭代NSArray类型的对象,如上面的代码,您应该使用NSArray函数enumerateObjectsUsingBlock代替,这是答案,看起来不是更多漂亮:

[self.formView.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if ([obj isKindOfClass:[UILabel class]]) {
            UILabel *label = (UILabel *)obj;
            if ( label.tag >= TEXTFIELDTYPE_MIN_VAL && label.tag <= TEXTFIELDTYPE_MAX_VAL ) {
                labelDict[[NSString stringWithFormat:@"%d",label.tag]] = label;
            }
        }
}]; 

3 个答案:

答案 0 :(得分:3)

Objective-C枚举继承自C枚举,无法在运行时反映出来。在不滥用调试符号的情况下(对于缓慢且不可靠的结果来说这将是一个过于复杂的任务),我相信不可能提出一个函数来告诉你任意值是否是任意枚举的成员。< / p>

一种可能的解决方法是创建一个包含所有枚举值的NSSet,并检查该集合中是否存在标签的标签。否则,如果您的枚举是连续的,您可以检查标记是否在枚举的最小值和最大值之间。

答案 1 :(得分:1)

尝试这个,而不是所有子视图的循环,运行你的枚举值的循环, 希望枚举值按顺序排列,然后只有下面的代码可以工作:

for(NSInteger tagVal = enum.firstEnum; tagVal <= enum.lastEnum; tagValue++) {
   NSObject *obj = [self.formView viewWithTag:tagVal];
   if ([obj isKindOfClass:[UILabel class]]) {
        UILabel *label = (UILabel *)obj;

        // Here is where I want to add the check before I do this line
        labelDict[[NSString stringWithFormat:@"%d",label.tag]] = label;
    }
}

答案 2 :(得分:0)

试试这个

if ([[dict allKeys] containsObject:lbl]) {

    }