【问题标题】:Enums management in Objective-CObjective-C 中的枚举管理
【发布时间】:2013-05-22 06:42:00
【问题描述】:

我需要有关如何在 Objective-C 中管理枚举的帮助或一些指导/最佳实践。我来自 C++/C# 领域,在那里我可以显式调用枚举,例如:

mycharacter.type = EnumType.enumValue;

没有冲突,因为我调用了枚举类型,然后是枚举值。在 Obj-C 中,枚举被创建为 typedef,所以它们都必须用唯一的数字索引,否则在运行时会出现问题。我最初是在他们各自的类中创建我的枚举,没有起始值,所以所有枚举最初都是零。我花了 2-3 个小时尝试解决 Cocos2D/Box2D 中的一些简单碰撞检测问题,后来发现这是由于枚举没有唯一值,所以碰撞没有正常发生。

如果有像 C#/C++ 一样调用枚举的方法,请告诉我,否则请指出一些知识库或最佳实践文档,因为我不是 C 开发人员。

请指教。

【问题讨论】:

  • 你能更清楚一点“枚举没有唯一值”吗?你的意思是两个不同的enums?单个enum 的每个组成部分始终具有不同的值。两个单独的枚举是如何冲突的?
  • 我不太关注。 C++ 中的枚举类型与 C 中的基本相同,只是它们会自动进行 typedef。
  • 嗨 Josh Caswell,Chuck,我的 Obj-C 项目中有几个枚举,没有初始值,所以默认情况下它们都从零开始。我创建了一个枚举: typedef enum { LEFT, RIGHT, TOP, BOTTOM } WallTags;由于某种原因,我的碰撞检测方法的 switch 语句无法识别 LEFT,直到我执行了 LEFT=101。然后它在 switch 语句中检测到它。我不确定两个枚举是否会发生冲突,但我的假设是作为最佳实践,所有枚举都应该至少有一个唯一的起始索引,因此不会与全局值或其他隐藏的#defines 发生冲突
  • @badboy11 为避免在 C 中发生冲突,我们倾向于为值添加前缀,例如:typedef enum { WallTags_LEFT, WallTags_RIGHT, WallTags_TOP, WallTags_BOTTOM } WallTags; 或在 C++ 中使用强类型枚举或在类范围内声明的枚举。
  • 是的,我一直在为我的枚举值添加前缀,使其具有唯一性和意义,以便可以轻松地将其与它们所属的对象及其用途相关联。我只是快速输入了一些代码,因为这里的 cmets 字符有限。这就是我实际创建要在 box2d 中的 SetUserData 中使用的 Wall Enum 的方式。 typedef enum { WALL_BOTTOM=101, WALL_RIGHT, WALL_TOP, WALL_LEFT } WallFixtureTag;

标签: objective-c enums


【解决方案1】:

Objective-C 是 C 的超集。C 风格的枚举实际上是在全局命名空间中声明的 C++ 枚举:

enum {
 MyConstant = 1
};

还有一个来自 AppKit 的示例:

enum {
    NSLayoutRelationLessThanOrEqual = -1,
    NSLayoutRelationEqual = 0,
    NSLayoutRelationGreaterThanOrEqual = 1,
};
typedef NSInteger NSLayoutRelation;

枚举值只是静态整数——你不能像对待对象一样向它们发送消息(在 C++ 中也是如此),也不能询问它们的名称或范围。您可以转换/转换为其他数字或指定它们的宽度(ObjC 中的扩展)。

由于枚举没有唯一值,所以碰撞没有正常发生

如果您不分配这些值,那么它们的值将自动比之前的枚举值大一。

因此,如果您想要一个更灵活的对象,您可能需要考虑创建一个类或使用一个集合。 C 枚举非常有用,而且非常基础。

请注意,您可以在同一个翻译中使用 Objective-C 中的 C++——它被称为 Objective-C++。

【讨论】:

  • 感谢贾斯汀的反馈。我有点想使用集合,但我个人喜欢枚举。它们非常强大且方便。我尝试创建一个 C++ 风格的枚举,但我仍然必须像 C 风格的 typedef 枚举一样分配它。我将尝试为我的所有枚举分配一个唯一的起始值,这样我就不必像今天遇到的那样痛苦地解决问题。我的代码库不大,但如果有更多的事情发生,肯定会很痛苦。
  • @badboy11 或者您可以使用更严格的 C++ 枚举来防止一些错误,或者您可以考虑使用第二个字段来分别区分枚举类型的结构。手动验证枚举不重叠很容易出错。不客气
【解决方案2】:

它们是 C 枚举。 它们不是对象。 它们适用于轻量级命名选项参数和位字段掩码选项,以及 C 开关情况条件。 您会发现它们在 Objective-C 中以这种方式使用。 应该没有冲突,因为它们只是 const 整数的 typedef。 要在 Xcode 中有效地使用它们,请务必对枚举和成员进行有意义的前缀和命名。这为您提供了有用的代码完成。

另请参阅有用的宏 NS_ENUM 和 NS_OPTION NSHipster 博客有一个很好的发送。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多