如何在类之间共享常量(枚举)?

No *_*ing 5 enums objective-c ios

我有一些UIPopoverViewControllers消息传递委托UIViewControllers传递UI事件.我没有为每个事件编写单独的方法,而是在委托中有一个方法,它有一个switch语句,它根据传递的常量确定如何处理事件(例如下面的例子).

这可能是糟糕的设计,但这是我想出来的.我已经看到关于枚举或静态类的这个问题,但是不理解答案.

So..is我在做什么,是有办法,我可以在一个地方定义枚举,这样我就不必维护多个代码位,可以很容易地得到不同步?

编辑好的,多挖一点(这里 + 这里)我看到我可能在正确的轨道上.所以我想我需要知道implementationiOS中文件的位置和位置.

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;
}
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*r M 15

我不会说你的方法是那么糟糕,但它确实对"神"方法的起始胚胎有轻微的感觉 - 这是一种试图做所有事情的方法.但是,对于代码中的选择数量,我会说它完全没问题.

但是分享枚举很简单.只需将它们放在自己的.h文件中,然后将其导入需要的地方.您可以将.h文件作为"C&C++"部分下的文件类型之一.

你引用的问题是基于C#,他们用那种语言做的一件事是设计相当于.h文件,只需使用"using"语句来找到正确的符号.在Objective-C中(如在C和C++中),您必须做更多的手动工作才能实现相同的目标.

顺便说一句,我会把枚举更多地打扮成:

typedef enum {
  kSetPlaybackType = 0,
  kSetAllNotesOn,
  kSetAllNotesOff,
  kSetVelocity,
  kSetDuration
} SetEnumType;
Run Code Online (Sandbox Code Playgroud)

通过在typedef中声明枚举,您可以声明该类型的变量.即代替:

int varName = kSetAllNotesOn;
Run Code Online (Sandbox Code Playgroud)

你可以说:

SetEnumType varName = kSetAllNotesOn;
Run Code Online (Sandbox Code Playgroud)

这为XCode提供了额外的提示,当您向自己提供自动完成选项时,它会使其在语义上更好地作为一个人阅读,因为您知道这varName是为了保存枚举,而不仅仅是任何旧数字.

缺点是您可能需要在枚举类型和int类型之间显式地转换varNum,具体取决于您正在执行的操作.

但是我不确定你是否可以声明你的方法签名

- (void)barPropertyAction:(SetEnumType)action withParam:(NSNumber *)param
Run Code Online (Sandbox Code Playgroud)

我猜你应该能够(因为我认为枚举是由int支持的).但如果你做不到,那你就是最好的

- (void)barPropertyAction:(int)action withParam:(NSNumber *)param
{
switch ((SetEnumType)action) {
    case kSetPlaybackType:
        playbackType = [param intValue];
Run Code Online (Sandbox Code Playgroud)