【问题标题】:Is there a native function that checks if a value is inside of an enum?是否有一个本机函数可以检查一个值是否在枚举中?
【发布时间】:2014-05-30 06:33:50
【问题描述】:

我试图将UILabels 放在NSDictionary 中,我使用标签作为键,但问题是,并非视图内的所有标签都需要,@ 的标签所需的 987654323@s 也在枚举中。

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

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;
            }
        }
}]; 

【问题讨论】:

  • 这是不可能的。您至少可以做的是创建一个 for 循环,其中包含标签数字的最小值的开始数字,然后是标签数字的最大值的结束数字,然后将其添加到字典中
  • 你的枚举是顺序的吗?如果是,您只需检查它是否在该范围内。
  • 是的,我是从 100 到 121 这样做的,因为我当前的代码在将它添加到字典之前依赖于 for(int a=100; a

标签: objective-c enums


【解决方案1】:

Objective-C 枚举继承自 C 枚举,不能在运行时反映。如果不滥用调试符号(对于缓慢且不可靠的结果,这将是一项过于复杂的任务),我相信不可能想出一个函数来告诉您任意值是否是任意枚举的成员。

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

【讨论】:

  • 是的,我的实际代码实际上就像你说的那样,它取决于枚举值的最小值和最大值,我只是希望它更加动态和高效,因为额外的循环是丑陋和低效的。感谢您的洞察力
  • 等等——额外循环?您不需要循环来检查它是否是成员,您只需要tag &gt;= myEnumMinimum &amp;&amp; tag &lt;= myEnumMaximum
【解决方案2】:

试试这个,而不是所有子视图的 for 循环,运行枚举值的 for 循环, 希望枚举值是按顺序排列的,那么只有下面的代码才能工作:

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;
    }
}

【讨论】:

  • 这是我的实际代码的样子,请采纳我的 +1 :D
【解决方案3】:

试试这个

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

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2021-05-12
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多