2010-06-26 55 views
18

我想知道是否可以添加/追加另一個項目到現有的枚舉類型(框架的一部分)?是否可以將另一項添加到現有的枚舉類型?

事情是這樣的:我們有enum

typedef enum { 
    UIModalTransitionStyleCoverVertical = 0, 
    UIModalTransitionStyleFlipHorizontal, 
    UIModalTransitionStyleCrossDissolve, 
    UIModalTransitionStylePartialCurl, 
} UIModalTransitionStyle; 

現在我想追加或添加到此設置的項目像UIModalTransitionStyleCoverVerticalFlipped。 可以這樣做嗎?

+0

如果你有框架的來源,你可以做這個和你喜歡的任何其他修改。 – ognian 2010-06-26 13:45:00

+0

你想做什麼是非常有意義的。不幸的是,枚舉不能真正在外部擴展,例如,類可以是(通過繼承等等)。 – apollodude217 2010-06-26 14:16:32

回答

8

要做到這一點,你必須修改原始類型的定義,包括新的價值:

typedef enum { 
    UIModalTransitionStyleCoverVertical = 0, 
    UIModalTransitionStyleFlipHorizontal, 
    UIModalTransitionStyleCrossDissolve, 
    UIModalTransitionStylePartialCurl, 
    UIModalTransitionStyleCoverVerticalFlipped 
} UIModalTransitionStyle; 

否則,你可以承擔其沒有工作機會,並單獨定義它:

typedef enum { 
    UIModalTransitionStyleCoverVertical = 0, 
    UIModalTransitionStyleFlipHorizontal, 
    UIModalTransitionStyleCrossDissolve, 
    UIModalTransitionStylePartialCurl, 
} UIModalTransitionStyle; 

typedef enum { 
    UIModalTransitionStyleCoverVerticalFlipped = 
     UIModalTransitionStylePartialCurl + 1 
} ExtendedUIModalTransitionStyle; 

,可以保持原有的枚舉通常也完全正常工作的變量當/如果您分配了新的價值,以及(在典型情況下,這將只是一個int) - 但它是不是有保證。至少在理論上,實現可以/可以分配足夠的位來保持枚舉,以這種方式添加更多的值將不起作用。它也可以進行範圍檢查,因此不允許指定任何超出範圍值。這些都不常見,因此從實際的角度來看,這可能不是問題 - 但從理論的角度來看,沒有什麼能真正保證這樣的代碼可以工作。

+0

感謝您的兩種可能的方法。我會和第二個一起去。 – user325746 2010-06-26 14:53:21

+0

@Jerry方法2假設在未來的SDK版本中,Apple將不會在UIModalTransitionStylePartialCurl後面添加其他類型,然後您會得到衝突。 – pnizzle 2015-07-02 03:29:56

+0

@pnizzle:是的,這就是我爲什麼特別說的原因之一:「你可以藉此機會不工作......」 – 2015-07-02 06:34:37

0

要做到這一點,你必須更新枚舉聲明包括UIModalTransitionStyleCoverVerticalFlipped這個值以及

typedef enum {  
UIModalTransitionStyleCoverVertical = 0,  
UIModalTransitionStyleFlipHorizontal,  
UIModalTransitionStyleCrossDissolve,  
UIModalTransitionStylePartialCurl,  
UIModalTransitionStyleCoverVerticalFlipped 
} UIModalTransitionStyle; 

所以UIModalTransitionStyleCoverVerticalFlipped將相當於徘徊無論你使用任何字符串從枚舉DEC中恆以整型常量4

。對應的常數值被替換,所以它被用來限制變量只保存指定的一組值(即0到4)在上述情況下

14

您可以強制新元素具有與枚舉相同的類型,但你不能在一個子類中擴展它。 頭文件:

extern const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped; 

實現文件:

const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped = 10; 

確保給予一定空間的情況下,框架被延長,讓你沒有衝突。這有點破解,但它會擺脫編譯器錯誤和警告。

+1

plus1確保給一些空間 – pnizzle 2015-07-02 03:30:46

0

也許這可以幫助你:

typedef NS_ENUM(NSInteger, BaseType) { 
    BaseTypeCase1, 
    BaseTypeCase2, 
    BaseTypeSize 
}; 

typedef NS_ENUM(NSInteger, SubType) { 
    SubTypeCase1 = BaseTypeSize, 
    SubTypeCase2 
}; 

現在你可以在子類型知道值是唯一的切換。

如果你沒有獲得基類型,你可以設置SubTypeCase1到BASETYPE的最後一個項目+ 1

壞處是,你不能宣佈採取型的方法,並傳遞給它的基類型,而不得到一個編譯器警告。所以你需要聲明你的方法來使用NSInteger來沉默這個警告。

相關問題