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

34 浏览
0 Comments

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

我有一些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;
}
}

admin 更改状态以发布 2023年5月23日
0
0 Comments

我不会说你的方法很糟糕,但它有一点像是“神”方法的雏形——试图做到所有事情的方法。但是,对于代码中的选择数量,我认为这是完全可以的。

但是,共享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];

0