【发布时间】: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