【问题标题】:how to share constants (enums) between classes?如何在类之间共享常量(枚举)?
【发布时间】:2012-03-19 07:12:12
【问题描述】:

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

这可能是糟糕的设计,但这是我想出的。我见过this 有关枚举或静态类的问题,但不明白答案。

所以..是我正在做的BAD,有没有一种方法可以在一个地方定义枚举,这样我就不必维护可以轻松退出的多个代码位同步?

编辑 好的,再挖掘一下 (here + here) 我知道我可能走在正确的轨道上。所以我想我需要知道 implementation 文件在 iOS 中的位置和位置。

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;
}
}

【问题讨论】:

    标签: objective-c ios enums


    【解决方案1】:

    我不会说你的方法有那么糟糕,但它确实有点像“上帝”方法的起始胚胎 - 这是一种尝试做所有事情的方法。但是,对于您在代码中的选择数量,我会说它非常好。

    但是共享枚举非常容易。只需将它们放在自己的 .h 文件中,然后在需要的地方导入即可。您可以将 .h 文件作为“C & C++”部分下的一种文件类型。

    您引用的问题是基于 C# 的,他们在该语言中所做的一件事是设计掉等效的 .h 文件,并仅使用“使用”语句来定位正确的符号。在 Objective-C 中(就像在 C 和 C++ 中一样),您必须做更多的手动工作才能实现相同的目标。

    顺便说一下,我会把枚举稍微修饰一下:

    typedef enum {
      kSetPlaybackType = 0,
      kSetAllNotesOn,
      kSetAllNotesOff,
      kSetVelocity,
      kSetDuration
    } SetEnumType;
    

    通过在 typedef 中声明枚举,您可以获得声明该类型变量的能力。即代替:

    int varName = kSetAllNotesOn;
    

    你可以说:

    SetEnumType varName = kSetAllNotesOn;
    

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

    缺点是您可能需要在 enum 类型和 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];
    

    【讨论】:

    • 另外,他应该做的一件事是使用typedef 命名枚举,而不是使用int 作为参数,此时需要指定的枚举。
    • @Sulthan 正如您评论的那样,我正在这样做:D
    • 这太好了 - 谢谢!我添加了 typedef + 常量名,并将枚举 defs 移动到 .h 文件中。能够在我的方法 sig 中使用 typedef。 - (void)barPropertyAction:(kBarProperty)action withParam:(NSNumber*)param;
    • @skinnyTOD 很高兴听到有关方法签名的信息。在 C# 中你可能无法摆脱它。这么多语言..这么多不同的语义!
    猜你喜欢
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 2017-10-22
    • 1970-01-01
    • 2011-12-15
    • 2015-06-09
    • 1970-01-01
    相关资源
    最近更新 更多