【问题标题】:Custom Enums - Unknown Type自定义枚举 - 未知类型
【发布时间】:2012-09-09 13:32:28
【问题描述】:

继续我的游戏,我想增加一些难度等等。

从 C# 到 Objective-C,我希望我能有一些像这样的枚举

typedef enum GameTypes{
    Classic = 0,
    Unlimited,
    Timed,
    Expert,
} GameType;

typedef enum GameDifficultys
{
    Easy = 0,
    Medium,
    Hard,
} GameDifficulty;

然后有这样的东西:

GameType gameType = GameTypes.Classic;
GameDifficulty gameDifficulty = GameDifficultys.Easy;

但是我收到以下错误:

Unknown type name "GameType"/"GameDifficulty"

这可能像在 C# 中一样吗?

谢谢

【问题讨论】:

    标签: objective-c enums


    【解决方案1】:

    C#C 发生过的最糟糕的事情之一。

    您的问题与 Objective-C 无关,这是一个普通的 C 问题。

    typedef enum GameTypes{
        Classic = 0,
        Unlimited,
        Timed,
        Expert,
    } GameType;
    

    该代码做了几件事情(我将只描述简单的事情)。首先,它声明了一个枚举类型,可以用作enum GameTypes。例如:

    enum GameTypes gameType = Classic;
    

    其次,将这4个名字放到全局命名空间中,使得ClassicUnlimitedTimedExpert可以使用,并且不能作为符号重复。

    第三,它创建了一个名为GameType的类型别名,可以用作enum GameTypes的别名。

    因此,对于您的具体示例,您不应区分 enum GameTypesGameType。相反,您可能应该这样做:

    typedef enum GameType {
        GameTypeClassic = 0,
        GameTypeUnlimited,
        GameTypeTimed,
        GameTypeExpert,
    } GameType;
    
    typedef enum GameDifficulty
    {
        GameDifficultyEasy = 0,
        GameDifficultyMedium,
        GameDifficultyHard,
    } GameDifficulty;
    

    然后……

    GameType gameType = GameTypeClassic;
    GameDifficulty gameDifficulty = GameDifficultyEasy;
    

    此外,您不必将第一个元素指定为 0,因为枚举的第一个元素将始终得到 0,除非它被显式覆盖。

    【讨论】:

      【解决方案2】:

      您似乎定义了错误的枚举。在 C 中,以下似乎是约定:

      typedef enum {
          Classic = 0,
          Unlimited,
          Timed,
          Expert,
      } GameTypes;
      
      typedef enum
      {
          Easy = 0,
          Medium,
          Hard,
      } GameDifficulties;
      

      即便如此,在 Objective-C 中使用枚举时,我还是会坚持使用 Apple 的命名约定,这会导致如下结果:

      typedef enum {
          GameTypeClassic = 0,
          GameTypeUnlimited,
          GameTypeTimed,
          GameTypeExpert,
      } GameType;
      
      typedef enum
      {
          GameDifficultyEasy = 0,
          GameDifficultyMedium,
          GameDifficultyHard,
      } GameDifficulty;
      

      现在您可以像这样分配值:

      GameType gameType = GameTypeClassic;
      GameDifficulty gameDifficulty = GameDifficultyEasy;
      

      检查 UITableView.h 中枚举是如何定义的以进行比较:https://github.com/enormego/UIKit/blob/master/UITableView.h

      【讨论】:

        猜你喜欢
        • 2011-09-11
        • 1970-01-01
        • 2012-03-10
        • 2016-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-08
        • 1970-01-01
        相关资源
        最近更新 更多