【问题标题】:Check if a variable belongs to an enum value检查变量是否属于枚举值
【发布时间】:2012-11-03 18:23:59
【问题描述】:

有没有办法将一组值分配给一个枚举并检查一个变量是否在objective-c中的那个枚举中具有它的值。 如果对象存在于数组中,则类似于获取数组中对象的索引。我想给出一个常见的行为,当在我的表格视图中点击某些索引(可能不按顺序)时,想要避免 if-ing 所有索引,希望我可以使用枚举样式。

【问题讨论】:

    标签: objective-c ios enums


    【解决方案1】:

    Objective-C 与大多数编程语言一样,不为原始类型提供“类型成员资格”测试——仅针对对象类型(例如isKindOfClass:)——因此使用enum 不会解决您的问题。

    但是,考虑到您首先考虑的是enum,听起来您有一小部分要检查的固定值。在这种情况下,您可以只使用静态数组,例如类似:

    static NSUInteger indices[] = { 2, 42, 57 };
    

    这种数组中的值的数量由sizeof(indices) / sizeof(NSUInteger 给出,您可以编写一个简单的循环或二分搜索来测试成员资格。

    如果你想使用对象,那么NSSet 是一个不错的选择,如果数字在执行过程中会发生变化,那么NSMutableSet。例如

    NSSet *indices = [NSSet setWithObjects:@2, @42, @57, nil];
    

    然后您使用member: 测试成员资格:

    if ([indices member:@indexToTest] != nil) ...
    

    (注意:与NSArray 不同,NSSetcontainsObject: 规范确实说它使用isEqual:,因此这里使用member:。)

    【讨论】:

    • 有用的答案,我认为我应该创建一组索引路径并检查当前选择的索引路径是否属于该集合并执行适当的操作。谢谢:)
    【解决方案2】:

    您不能为此使用enum,因为您无法枚举它们或调用某事。喜欢他们的contains。如果我理解正确,我认为直接的方法是使用NSArray 来存储您关心的索引。假设您要识别索引 2,6 和 14:

    NSArray *indices = [NSArray arrayWithObjects: @2, @6, @14, nil];
    

    @ 是必需的,因为 NSArray 只能存储对象。@ 将整数转换为 NSNumber 实例。

    然后检查当前选择的索引是否在其中:

    int indexToCheck = ...;
    BOOL indexIsInArray = [index containsObject:@(indexToCheck)];
    

    如果您正在寻找一种更“花哨”(更快)的方法,您可以使用位运算(再次以 2,6 和 14 为例):

    int indices = 1 << 2 | 1 << 6 | 1 << 14;
    

    然后检查:

    int indexToCheck = ...;
    BOOL isValid = (1 << indexToCheck) & indices;
    

    indexToCheck 在您的indices 之一中时,isValid 为真。

    【讨论】:

    • 给定名称很容易犯错误,但containsObject: 通过调用isEqual: 进行 比较并且不进行参考比较。因此,如果使用数组,它只是 [indices containsObject:@(indexToCheck)]
    【解决方案3】:

    不,内部枚举基于整数,并且映射发生在编译时。因此,您需要对每种枚举类型进行特定检查(如果它们是连续数字,则可以使用“>”和“

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      相关资源
      最近更新 更多