如果我有以下枚舉類型:的Objective-C:從集合中獲取最高的枚舉類型
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
當我使用斷點檢查A型的價值,我看到:
aType = (EnumType) 4294967295
這是according to Wikipedia 32位系統的最大無符號長整型值。
這是否意味着我不能將值分配給枚舉類型,是不是在該類型的值的有效範圍 ?
爲什麼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)不是?!
Thanks @mopsled for your time。你的建議的問題是,如果集合是空的,我會以類型== 0結束,這與Type1的值相同,所以結果會令人誤解。有沒有辦法解決這個問題? – Motasim
首先檢查'[allTypes count]'。如果這是零,那麼你將找不到任何價值。否則(如果'allTypes'有一個或多個元素),那麼你的代碼全部設置爲找到最大值。 – mopsled
這不是真正解決原始代碼錯誤的答案,只是一個提示:如果你想從數組中獲得最大值,你可以使用'[array valueForKeyPath:@「@ max.self」]' 。 – Chuck