2012-02-29 82 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