Если у меня есть следующий тип перечисления:
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) нет?!