1

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

mycharacter.type = EnumType.enumValue;

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

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

请指教。

4

2 回答 2

3

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++。

于 2013-05-22T06:49:11.453 回答
0

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

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

于 2013-05-22T07:04:57.693 回答