2012-02-29 36 views
5

我有一些UIPopoverViewControllers做消息傳遞給委託UIViewControllers傳遞UI事件。我沒有爲每個事件編寫單獨的方法,而是在委託中使用switch語句來決定如何根據傳遞的常量處理事件(下面的示例)。如何在類之間共享常量(枚舉)?

這可能是糟糕的設計,但這是我想出的。我已經看到this有關枚舉或靜態類的問題,但不明白答案。

So..is我在做什麼BAD,是有辦法,我可以在一個地方定義枚舉,這樣我就不必維護多個代碼位,可以很容易地得到不同步?

編輯好了,周圍多一點(here + here)我知道我可能是在正確的軌道上挖。所以我想我需要知道在iOS中implementation文件的內容和位置。

enum { 
kSetPlaybackType = 0, 
kSetAllNotesOn, 
kSetAllNotesOff, 
kSetVelocity, 
kSetDuration 
}; 

- (void)barPropertyAction:(int)action withParam:(NSNumber *)param 
{ 
switch (action) { 
    case kSetPlaybackType: 
     playbackType = [param intValue]; 
     if (playbackType == kPalindrome){ 
      palindromeDirection = kPalindromeUp; 
     } 
     break; 

    case kSetAllNotesOn: 
     for (BarNote* note in self.barNoteArray) { 
      note.noteOn = YES; 
     } 
     [self.bar updateWindows]; 
     break; 

    case kSetAllNotesOff: 
     for (BarNote* note in self.barNoteArray) { 
      note.noteOn = NO; 
     } 
     [self.bar updateWindows]; 
     break; 

    case kSetVelocity: 
     for (BarNote* note in self.barNoteArray) { 
      note.velocity = [param intValue]; 
     } 
     break; 

    case kSetDuration: 
     for (BarNote* note in self.barNoteArray) { 
      note.duration = [param floatValue]; 
     } 
     break; 

    default: 
     break; 
} 
} 

回答

14

我不會說,你的做法是是壞的,但它確實有輕微的感覺,這是一個「神」方法的起始胚胎 - 這是試圖做的方法一切。但是,對於代碼中的選擇數量,我會說它非常好。

但共享枚舉的周圍是非常容易的。只需將它們放在自己的.h文件中,並將其導入需要的地方即可。您可以在「C & C++」部分中包含.h文件作爲其中一種文件類型。

您引用的問題是基於C#的,他們在該語言中做的一件事是設計掉.h文件的等價物,並使用「using」語句來找到正確的符號。在Objective-C中(如在C和C++中),你必須做更多的手動工作才能達到同樣的效果。

順便說一句,我會稍微作爲禮服枚舉了:

typedef enum { 
    kSetPlaybackType = 0, 
    kSetAllNotesOn, 
    kSetAllNotesOff, 
    kSetVelocity, 
    kSetDuration 
} SetEnumType; 

通過聲明在typedef枚舉,您將獲得聲明該類型的變量的能力。 IE的替代:

int varName = kSetAllNotesOn; 

你可以說:

SetEnumType varName = kSetAllNotesOn; 

這與自動完成功能的選擇呈現你的時候提供額外的提示,XCode中,這使得它在語義上更好的閱讀作爲一個人,你也知道該varName是爲了舉行枚舉,而不是任何舊號碼。

缺點是,您可能需要顯式地在枚舉類型和int類型之間轉換varNum,具體取決於您在做什麼。

但是我不知道你是否可以宣佈你的方法簽名

- (void)barPropertyAction:(SetEnumType)action withParam:(NSNumber *)param 

我猜你應該能夠(因爲我覺得枚舉由一個int支持)。但是,如果你不能,那麼你最好做

- (void)barPropertyAction:(int)action withParam:(NSNumber *)param 
{ 
switch ((SetEnumType)action) { 
    case kSetPlaybackType: 
     playbackType = [param intValue]; 
+0

而且,他應該做的是命名使用'typedef'枚舉,而不是使用'int'作爲參數的一件事,當預期指定的枚舉。 – Sulthan 2012-02-29 19:32:53

+0

@Sulthan我這樣做,因爲你評論:D – 2012-02-29 19:35:12

+0

這是偉大的 - 謝謝!我已經添加了typedef +常量名稱,並將枚舉定義移至.h文件。能夠在我的方法sig中使用typedef。 ' - (void)barPropertyAction:(kBarProperty)action withParam:(NSNumber *)param;' – 2012-02-29 20:12:23