【问题标题】:Objective-C: Getting the highest enum type from a collectionObjective-C:从集合中获取最高的枚举类型
【发布时间】:2011-08-16 00:40:44
【问题描述】:

如果我有以下枚举类型:

   typedef enum {Type1=0, Type2, Type3} EnumType;

下面的代码(如果转换成 Java 就可以正常工作):

   NSArray *allTypes = [NSArray arrayWithObjects:[NSNumber numberWithInt:Type1], [NSNumber numberWithInt:Type2], [NSNumber numberWithInt:Type3], nil];

   EnumType aType = -1;

   NSLog(@"aType is %d", aType); // I expect -1

   // Trying to assign the highest type in the array to aType
   for (NSNumber *typeNum in allTypes) {
      EnumType type = [typeNum intValue];
      NSLog(@"type is: %d", type);
      if (type > aType) {
         aType = type;
      }
   }
   NSLog(@"aType is %d", aType); // I expect 2

生成的日志是:

TestEnums[11461:b303] aType is: -1
TestEnums[11461:b303] type  is: 0
TestEnums[11461:b303] type  is: 1
TestEnums[11461:b303] type  is: 2
TestEnums[11461:b303] aType is: -1

当我使用断点检查 aType 的值时,我看到:

aType   = (EnumType) 4294967295

according to Wikipedia 是 32 位系统的最大 unsigned long int 值。

  • 这是否意味着我不能为非枚举类型赋值 在类型值的有效范围内?

  • 为什么log(-1)的值与真实值不同 (4294967295)?和说明符(%d)有关系吗?

  • 如何在不添加新内容的情况下实现我在此处尝试执行的操作 类型来表示无效值?请注意,该集合可能 有时是空的,这就是为什么我在开头使用 -1 表示如果集合为空则没有类型。

注意:我是 Objective-C/ANSI-C 的新手。

谢谢, 莫塔

编辑:

这是我发现的一些奇怪的东西。如果我将循环内的条件更改为:

if (type > aType || aType == -1)

我得到以下日志:

TestEnums[1980:b303] aType is -1
TestEnums[1980:b303] type is: 0
TestEnums[1980:b303] type is: 1
TestEnums[1980:b303] type is: 2
TestEnums[1980:b303] aType is 2

这正是我要找的!奇怪的部分是 (aType == -1) 是真的,而 (Type1 > -1)、(Type2 > -1) 和 (Type3 > -1) 不是?!

【问题讨论】:

    标签: objective-c enums


    【解决方案1】:

    似乎EnumType 被定义为unsigned 类型。当您将其分配给 -1 时,该值实际上回滚到无符号 32 位整数的最高可能值(如您所见)。因此,通过从-1 开始值,您可以确保与它进行比较的其他值可能不会更高,因为它被分配给数据类型的最大值 (@987654325 @)。

    我建议只在0 开始计数器,因为它是EnumType 的最低值。

    EnumType aType = 0;
    

    如果要检查是否选择了 any 值,可以先检查集合的 count 以查看是否有任何值。

    【讨论】:

    • 感谢@mopsled 抽出宝贵时间。您的建议的问题是,如果集合为空,我最终会得到 aType == 0,这与 Type1 的值相同,因此结果会产生误导。有没有办法克服这个问题?
    • 首先检查[allTypes count]。如果这是零,那么您将找不到任何值。否则(如果allTypes 有一个或多个元素),那么您的代码将全部设置为找到最大值。
    • 这并不是原始代码问题的真正答案,而只是一个提示:如果您想要数组中的最大值,您可以使用[array valueForKeyPath:@"@max.self"]
    • @mopsled,非常感谢。我希望找到一种更简单的方法来实现这一点,因为我多次使用这个代码和很多枚举类型。我将再等两天,看看是否存在更简单的方法。然后我会选择一个答案。感谢您的宝贵时间。
    • @Chuck,很棒的提示 Chuck!非常感谢,你让我很开心。
    猜你喜欢
    • 2017-01-14
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多