NS_ENUM 和 NS_OPTIONS的區別

來源:互聯網
上載者:User

標籤:約束   tail   文檔   view   repr   簡單   and   get   lock   

在蘋果的一篇官方文檔《Adopting Modern Objective-C》“適應現代的Objectice-c”中提及到使用NS_ENUM和NS_OPTIONS來聲明枚舉

NS_ENUM用來聲明基於一般整形的枚舉,而NS_OPTIONS一般用來聲明基於位元遮罩的聲明(bitmask)

在一般的教程書中也經常提及,但是其中的區別是什麼呢?

在NSObjCRuntime.h中有如下的宏定義

 

[cpp] view plain copy
  1. #define NS_ENUM(_type, _name) CF_ENUM(_type, _name)  
[cpp] view plain copy
  1. #define NS_OPTIONS(_type, _name) CF_OPTIONS(_type, _name)  

就是說,NS_ENUM 、CF_ENUM是一樣的,NS_OPTIONS、CF_OPTIONS是一樣的

 

那再具體分析下CF_ENUM,CF_OPTIONS宏到底是什麼東西

在CF_ENUM,CF_OPTIONS宏定義標頭檔CFAvailability.h中有如下的宏定義

 

 

[cpp] view plain copy
  1. #if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))  
  2.     #define CF_ENUM(_type, _name) enum _name : _type _name; enum _name : _type  
  3.     #if (__cplusplus)  
  4.         #define CF_OPTIONS(_type, _name) _type _name; enum : _type  
  5.         #else  
  6.         #define CF_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type  
  7.     #endif  
  8. #else  
  9.     #define CF_ENUM(_type, _name) _type _name; enum  
  10.     #define CF_OPTIONS(_type, _name) _type _name; enum  
  11. #endif  


 

詐一看,其實兩者基本思想是沒有區別的,並沒有說NS_ENUM枚舉的元素非得是整型,NS_OPTIONS枚舉的元素非得是與位有關的,據其根本

枚舉的目的是為整型資料添加一個名字罷了。NS_ENUM,NS_OPTIONS只是為了代碼的統一性,約束一下編碼規則罷了。


但是,仔細看的又會發現有不同,為什麼有時候將宏定義為#define CF_OPTIONS(_type, _name) _type _name; enum : _type或者#define CF_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type

 

StackOverflow 裡面這個問題說到,但是前面幾個回答似乎有點簡單,沒有說到重點,最後那個回到似乎很有道理

具體是說因為c++11支援了枚舉的向前聲明(forward declare),因而出現的bug,為相容使用到了類如“CF_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type”

 

NS_ENUM 和 NS_OPTIONS的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.