Objective-C: получить самый высокий тип перечисления из коллекции - PullRequest
3 голосов
/ 16 августа 2011

Если у меня есть следующий тип перечисления:

   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

Что составляет согласно Википедии максимальное значение без знака long int для32-разрядные системы.

  • Означает ли это, что я не могу присвоить значение типам перечислений, которые не находятся в допустимом диапазоне значений типа?

  • Почему значение журнала (-1) отличается от реального значения (4294967295)?Это как-то связано со спецификатором (% d)?

  • Как мне добиться того, что я пытаюсь сделать здесь, не добавляя новый тип для представления недопустимого значения?Обратите внимание, что коллекция может иногда быть пустой, поэтому я использую -1 в начале, чтобы указать, что нет типа, если коллекция была пустой.

Примечание: I 'Я новичок в 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) нет?!

1 Ответ

5 голосов
/ 16 августа 2011

Кажется, что EnumType определен как тип unsigned. Когда вы присваиваете ему -1, это значение фактически возвращается к максимально возможному значению для 32-разрядного целого числа без знака (как вы нашли). Таким образом, начиная со значения -1, вы гарантируете, что никакое другое значение, с которым вы его сравниваете, не может быть выше , поскольку оно назначено максимальному значению для типа данных (4294967295 ).

Я бы предложил вместо этого начать счетчик с 0, так как это минимально возможное значение для EnumType.

EnumType aType = 0;

Если вы хотите проверить, было ли выбрано любое значение, вы можете проверить count коллекции, чтобы узнать, есть ли какие-либо значения вначале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...