是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的定义方式让我更加困惑,因为我不理解这里的语法,任何人都可以从句法角度详细解释这个定义吗?感谢。
答案 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宏是声明枚举类型的新的首选方式。”