为什么可以用这种方式定义NS_ENUM

时间:2014-03-05 04:11:50

标签: objective-c

是Objetive-C的新手,今天我遇到了NS_ENUM marco,它可以像:

typedef NS_ENUM(Type, MyType) {
 Foo,
 Bar
};

为什么必须在这里使用typedof的用法有点奇怪,所以我检查了NS_ENUM的源代码:

#if (__cplusplus && __cplusplus >= 201103L &&
        (__has_extension(cxx_strong_enums) ||
         __has_feature(objc_fixed_enum))
    ) ||
    (!__cplusplus && __has_feature(objc_fixed_enum))
    #define NS_ENUM(_type, _name)
            enum _name : _type _name; enum _name : _type
    #if (__cplusplus)
        #define NS_OPTIONS(_type, _name)
                _type _name; enum : _type
    #else
        #define NS_OPTIONS(_type, _name)
                enum _name : _type _name; enum _name : _type
    #endif
#else
    #define NS_ENUM(_type, _name) _type _name; enum
    #define NS_OPTIONS(_type, _name) _type _name; enum
#endif

NS_ENUM的定义方式让我更加困惑,因为我不理解这里的语法,任何人都可以从句法角度详细解释这个定义吗?感谢。

2 个答案:

答案 0 :(得分:2)

这是一个简单的字符串替换机制。此

#define NS_ENUM(_type, _name)
        enum _name : _type _name; enum _name : _type

意味着这个

typedef NS_ENUM(int, myEnumType)

将被此

取代
enum myEnumType : int myEnumType;
enum myEnumType : int

this source,您可以看到枚举语法为:

enum [tag] [: type] {enum-list} [declarator];   // for definition of enumerated type
enum tag declarator;   // for declaration of variable of type tag

答案 1 :(得分:1)

有关完整信息和用法,请参阅:NS_ENUM & NS_OPTIONS

来自NSHipster:“在iOS 6 / Mac OS X 10.8的基础中引入,NS_ENUM和NS_OPTIONS宏是声明枚举类型的新的首选方式。”