2014-03-05 146 views
1

是新來的Objetive-C來定義,今天我遇到NS_ENUM馬可像使用:爲什麼NS_ENUM以這種方式

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

HT tp://en.wikipedia.org/wiki/C_preprocessor – Merlevede

+0

http://clang.llvm.org/docs/LanguageExtensions.html#enumerations-with-a-fixed-underlying-type –

+0

http://www.apeth。 com/iOSBook/ch01.html#SBnewenum – matt

回答

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

這就是我想要的,謝謝。 – Foredoomed

1

請參閱:NS_ENUM & NS_OPTIONS的完整信息和用法。

來自NSHipster:「在基金會iOS 6/Mac OS X 10.8中引入,NS_ENUM和NS_OPTIONS宏是聲明枚舉類型的新的首選方法。」

相關問題