关于C#:如何在类之间共享常量(枚举)?

how to share constants (enums) between classes?

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

这可能是糟糕的设计,但这是我想出的。我见过这个关于枚举或静态类的问题,但我不理解答案。

那么..我做得不好吗?有没有一种方法可以在一个地方定义枚举,这样我就不必维护多个容易失去同步的代码位?

编辑好了,多挖一点(这里+这里),我看到我可能在正确的轨道上。所以我想我需要知道iOS中的implementation文件是什么以及在哪里。

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提供额外的提示,并且它使作为一个人阅读变得更好,正如您所知道的,varName是用来保存枚举的,而不仅仅是任何旧的数字。

缺点是,可能需要根据所做的操作,在枚举类型和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];