2011-08-16 70 views
3

如果我有以下枚舉類型:的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)不是?!

回答

5

看起來好像EnumType被定義爲unsigned類型。當您將其分配給-1時,此值實際上會回滾到無符號32位整數的最高可能值(如您找到的那樣)。因此,通過在-1處開始值,您確保沒有其他值與您比較可能會更高,因爲它被分配給數據類型(4294967295)的最大值。

我建議只需在0處啓動計數器,因爲這是EnumType的最小可能值。

EnumType aType = 0; 

如果你想檢查是否選擇任何值,你可以檢查收集的count,看看是否有任何價值第一。

+0

Thanks @mopsled for your time。你的建議的問題是,如果集合是空的,我會以類型== 0結束,這與Type1的值相同,所以結果會令人誤解。有沒有辦法解決這個問題? – Motasim

+0

首先檢查'[allTypes count]'。如果這是零,那麼你將找不到任何價值。否則(如果'allTypes'有一個或多個元素),那麼你的代碼全部設置爲找到最大值。 – mopsled

+4

這不是真正解決原始代碼錯誤的答案,只是一個提示:如果你想從數組中獲得最大值,你可以使用'[array valueForKeyPath:@「@ max.self」]' 。 – Chuck