【问题标题】:NS_ENUM without nameNS_ENUM 没有名字
【发布时间】:2016-05-31 13:40:58
【问题描述】:

这行在我的代码中是可以的:

typedef NS_ENUM(NSInteger,  unused_name)
{   k_a = 123,
    k_b = 123,
    k_c = 61
};

但以下几行不是。编译器抱怨 NS_ENUM 的变量 (...) 部分不包含任何变量。

NS_ENUM(NSInteger)
{   k_a = 123,
    k_b = 123,
    k_c = 61
};

我对 CF_ENUM 也有同样的问题。

我认为这不是头文件的问题(Foundation/NSObjCRuntime.h 或 Core Foundation)。

【问题讨论】:

  • 我写了一个答案,但看起来你到目前为止所做的一切都是正确的。只需确保您的枚举声明位于任何 Objective-C 接口或实现代码块之外。
  • 你不能有一个没有名字的 NS_ENUM。该名称成为用于 NS_ENUM 的 typedef 的名称。使用像“unused_name”这样的非唯一名称会给您带来麻烦。根本不给名字是行不通的。这不是标题的问题 - 这是您的代码的问题。你做错了什么,编译器会告诉你。
  • @gnasher729 除非我遗漏了一些东西,否则您实际上可以拥有一个没有名称的 NS_ENUM(例如问题中的第二个代码块)。它只是在 Xcode 的代码完成中显示为 enum <anonymous>
  • 一目了然,代码看起来是合法的。您使用的是什么编译器和版本?这些语句在您的代码中的什么位置(源代码、标题、内部接口/实现等)?
  • @CRD 我正在使用 Xcode 7.3.1。代码行在接口之后和实现块之前。

标签: objective-c cocoa enums


【解决方案1】:

NSObjCRuntime.h头文件中的注释:

/* NS_ENUM supports the use of one or two arguments. The first argument is always the integer type used for the values of the enum. The second argument is an optional type name for the macro. When specifying a type name, you must precede the macro with 'typedef' like so:


typedef NS_ENUM(NSInteger, NSComparisonResult) {
    ...
};

If you do not specify a type name, do not use 'typedef'. For example:

NS_ENUM(NSInteger) {
    ...
};
*/

简而言之,如果您的枚举未命名,请不要使用typedef。此外,请确保枚举声明在文件的顶部或底部,在任何 Objective-C 接口或实现块之外。

NS_ENUM(NSInteger)
{   k_a = 123,
    k_b = 123,
    k_c = 61
};

typedef NS_ENUM(NSInteger,  unused_name)
{   k_d = 123,
    k_e = 123,
    k_f = 61
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 2012-12-14
    相关资源
    最近更新 更多