如何在类之间共享常量(枚举)?
如何在类之间共享常量(枚举)?
我有一些UIPopoverViewControllers
,它们通过委托UIViewControllers
进行消息传递以传递UI事件。我没有为每个事件编写单独的方法,而是在委托中有一个带有switch语句的方法,根据传递的常量确定如何处理事件(如下面的示例所示)。
这可能是很差的设计,但这是我想到的。我看到了关于枚举或静态类的这个问题,但不理解答案。
那么...我所做的是不好的吗?有没有一种方法可以在一个地方定义枚举,以便我不必维护多个容易失步的代码?
编辑 好吧,再深入挖掘一下(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; } }
我不会说你的方法很糟糕,但它有一点像是“神”方法的雏形——试图做到所有事情的方法。但是,对于代码中的选择数量,我认为这是完全可以的。
但是,共享enum非常容易。将它们放在自己的.h文件中,并在需要的地方导入它们。您可以将.h文件包含为“C&C ++”部分下的一种文件类型。
您引用的问题是基于C#的,在这种语言中,他们所做的一件事是设计掉.h文件的等效物,只是使用“using”语句定位正确的符号。在Objective-C(如C和C ++)中,您需要做更多的手动工作才能实现相同的事情。
顺便说一句,我会稍微装饰一下枚举:
typedef enum { kSetPlaybackType = 0, kSetAllNotesOn, kSetAllNotesOff, kSetVelocity, kSetDuration } SetEnumType;
通过在typedef中声明枚举,您可以声明该类型的变量。即,代替:
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];