how to share constants (enums) between classes?
我有一些
这可能是糟糕的设计,但这是我想出的。我见过这个关于枚举或静态类的问题,但我不理解答案。
那么..我做得不好吗?有没有一种方法可以在一个地方定义枚举,这样我就不必维护多个容易失去同步的代码位?
编辑好了,多挖一点(这里+这里),我看到我可能在正确的轨道上。所以我想我需要知道iOS中的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | 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; } } |
我不想说你的方法有那么糟糕,但它确实有点像"上帝"方法的初创阶段——这是一种尝试做任何事情的方法。但是,对于代码中的选择数量,我认为这是非常好的。
但是共享枚举是非常容易的。只需将它们放在自己的.h文件中并在需要时导入即可。可以将.h文件包含为"C++c++"部分下的文件类型之一。
你提到的问题是基于C语言的,他们用这种语言做的一件事就是设计出相当于.h文件的文件,并使用"using"语句来定位正确的符号。在ObjtoE-C(如C和C++)中,你必须做更多的手工工作来达到同样的目的。
顺便说一下,我会把枚举稍微修饰一下:
1 2 3 4 5 6 7 | typedef enum { kSetPlaybackType = 0, kSetAllNotesOn, kSetAllNotesOff, kSetVelocity, kSetDuration } SetEnumType; |
通过在typedef中声明枚举,您可以声明该类型的变量。代替:
1 | int varName = kSetAllNotesOn; |
你可以说:
1 | SetEnumType varName = kSetAllNotesOn; |
当向您展示自动完成选项时,这会给Xcode提供额外的提示,并且它使作为一个人阅读变得更好,正如您所知道的,
缺点是,可能需要根据所做的操作,在枚举类型和int类型之间显式地强制转换varnum。
但是,我不确定您是否可以将方法签名声明为
1 | - (void)barPropertyAction:(SetEnumType)action withParam:(NSNumber *)param |
我猜想您应该能够(正如我认为枚举由int支持的那样)。但如果你不能,那你最好做
1 2 3 4 5 | - (void)barPropertyAction:(int)action withParam:(NSNumber *)param { switch ((SetEnumType)action) { case kSetPlaybackType: playbackType = [param intValue]; |