枚舉enum、NS_ENUM 、NS_OPTIONS

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

enum

?

了解位移枚舉之前,我們先回顧一下C語言位運算符。

1? ? ?<<?:?左移,比如1<<n,表示1往左移n位,即數值大小2的n次方;?例如?:?0b0001?<<?1?變為了?0b0010

2? ? ?>>?:?右移,類似左移,數值大小除以2的n次方
3? ? ?&? :?按位與,1與任意數等于任意數本身,0與任意數等于0,即1&x=x,0&x=0
4? ? ?|? :?按位或,x|y中只要有一個1則結果為1;反之為0
5? ? ?^? :?按位異或,x^y相等則為0,不等則為1

?

?

typedef enum A {
??? a = 0,
??? b,
??? c,
??? d,
} englishWord;

typedef enum {
??? e = 4,
??? f,
??? g,
} englishWord2;

englishWord eg1 = a;
englishWord2 eg2 = e;

// enum newNum:NSInteger枚舉變量,并且繼承NSInteger;englishWord3 枚舉的別名
typedef enum newNum:NSInteger englishWord3;
enum newNum:NSInteger {
??? new1 = 10,
??? new2,
};
englishWord3 eg3 = new1;

eg1 = 0,eg2 = 4, eg3 = 10

?

2、NS_ENUM 、NS_OPTIONS

OC中常見的枚舉,例如常見的:

typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {

UIViewAnimationCurveEaseInOut,???????? // slow at beginning and end

UIViewAnimationCurveEaseIn,??????????? // slow at beginning

UIViewAnimationCurveEaseOut,?????????? // slow at end

UIViewAnimationCurveLinear

};

typedef NS_OPTIONS(NSUInteger, UIViewAnimationOptions) {

UIViewAnimationOptionLayoutSubviews??????????? = 1 <<? 0,

UIViewAnimationOptionAllowUserInteraction????? = 1 <<? 1, // turn on user interaction while animating

UIViewAnimationOptionBeginFromCurrentState???? = 1 <<? 2, // start all views from current value, not initial value

UIViewAnimationOptionRepeat??????????????????? = 1 <<? 3, // repeat animation indefinitely

UIViewAnimationOptionAutoreverse?????????????? = 1 <<? 4, // if repeat, run animation back and forth

UIViewAnimationOptionOverrideInheritedDuration = 1 <<? 5, // ignore nested duration

UIViewAnimationOptionOverrideInheritedCurve??? = 1 <<? 6, // ignore nested curve

UIViewAnimationOptionAllowAnimatedContent????? = 1 <<? 7, // animate contents (applies to transitions only)

UIViewAnimationOptionShowHideTransitionViews?? = 1 <<? 8, // flip to/from hidden state instead of adding/removing

UIViewAnimationOptionOverrideInheritedOptions? = 1 <<? 9, // do not inherit any options or animation type

UIViewAnimationOptionCurveEaseInOut??????????? = 0 << 16, // default

UIViewAnimationOptionCurveEaseIn?????????????? = 1 << 16,

UIViewAnimationOptionCurveEaseOut????????????? = 2 << 16,

UIViewAnimationOptionCurveLinear?????????????? = 3 << 16,

UIViewAnimationOptionTransitionNone??????????? = 0 << 20, // default

UIViewAnimationOptionTransitionFlipFromLeft??? = 1 << 20,

UIViewAnimationOptionTransitionFlipFromRight?? = 2 << 20,

UIViewAnimationOptionTransitionCurlUp????????? = 3 << 20,

UIViewAnimationOptionTransitionCurlDown??????? = 4 << 20,

UIViewAnimationOptionTransitionCrossDissolve?? = 5 << 20,

UIViewAnimationOptionTransitionFlipFromTop???? = 6 << 20,

UIViewAnimationOptionTransitionFlipFromBottom? = 7 << 20,

} NS_ENUM_AVAILABLE_IOS(4_0);

?

這兩個宏的定義在Foundation.framework的NSObjCRuntime.h中:

#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

?

?

typedef?NS_ENUM(NSInteger,?UIViewAnimationTransition)?{

展開得到:

  1. typedef?enum?UIViewAnimationTransition?:?NSInteger?UIViewAnimationTransition;??
  2. enum?UIViewAnimationTransition?:?NSInteger?{

?

其實從枚舉定義來看,NS_ENUM和NS_OPTIONS本質是一樣的,僅僅從字面上來區分其用途。NS_ENUM是通用情況,NS_OPTIONS一般用來定義具有位移操作或特點的情況(bitmask)。

?

開發中,你也許見到過或用過類似這種的枚舉類型:

typedef?NS_OPTIONS(NSUInteger,?BDRequestOptions)?{

? ? BDRequestOptionSuccess? ? ?=?1?<<?0,
? ? BDRequestOptionFailure? ? ?
=?1?<<?1,
? ? BDRequestOptionProcessing?
=?1?<<?2,
? ? BDRequestOptionAnimate? ? ?
=?1?<<?3,
};

其實這種的并不是枚舉,而是按位掩碼(bitmask),他的語法和枚舉相同。但用法卻不同。

示例:

// 首先定義一組
typedef NS_OPTIONS(NSUInteger, BDRequestOptions) {BDRequestOptionSuccess     = 1 << 0,BDRequestOptionFailure     = 1 << 1,BDRequestOptionProcessing  = 1 << 2,BDRequestOptionAnimate     = 1 << 3,
};// 然后調用我們定義的方法
#pragma mark - View lifeCycle
- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor orangeColor];[self test:BDRequestOptionSuccess | BDRequestOptionFailure | BDRequestOptionProcessing | BDRequestOptionAnimate];
}- (void)test:(BDRequestOptions)type {if (type & BDRequestOptionSuccess) {NSLog(@"BDRequestOptionSuccess");}if (type & BDRequestOptionFailure) {NSLog(@"BDRequestOptionFailure");}if (type & BDRequestOptionProcessing) {NSLog(@"BDRequestOptionProcessing");}if (type & BDRequestOptionAnimate) {NSLog(@"BDRequestOptionAnimate");}
}// 查看打印結果:
2016-04-04 14:09:44.946 OC測試[5869:719056] BDRequestOptionSuccess
2016-04-04 14:09:44.947 OC測試[5869:719056] BDRequestOptionFailure
2016-04-04 14:09:44.947 OC測試[5869:719056] BDRequestOptionProcessing
2016-04-04 14:09:44.947 OC測試[5869:719056] BDRequestOptionAnimate

分析:

// 首先定義一組
typedef NS_OPTIONS(NSUInteger, BDRequestOptions) {BDRequestOptionSuccess     = 0b0001 << 0,BDRequestOptionFailure     = 0b0010 << 1,BDRequestOptionProcessing  = 0b0100 << 2,BDRequestOptionAnimate     = 0b1000 << 3,
};#pragma mark - View lifeCycle
- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor orangeColor];[self test:BDRequestOptionSuccess | BDRequestOptionFailure | BDRequestOptionProcessing | BDRequestOptionAnimate];/** BDRequestOptionSuccess | BDRequestOptionFailure | BDRequestOptionProcessing | BDRequestOptionAnimate等同于:0b0001 |0b0010 |0b0100 |0b1000 結果為:0b1111*/
}- (void)test:(BDRequestOptions)type {// 0b1111 & 0b0001 --->  0b0b0001if (type & BDRequestOptionSuccess) {NSLog(@"BDRequestOptionSuccess");}// 0b1111 & 0b0010 --->  0b0b0010if (type & BDRequestOptionFailure) {NSLog(@"BDRequestOptionFailure");}// 0b1111 & 0b0100 --->  0b0b0100if (type & BDRequestOptionProcessing) {NSLog(@"BDRequestOptionProcessing");}// 0b1111 & 0b1000 --->  0b0b1000if (type & BDRequestOptionAnimate) {NSLog(@"BDRequestOptionAnimate");}
}

?

另,默認的,如果開發中枚舉值傳0,意味著不做任何操作。

例如:

// 傳0,不打印任何值
[self test:0];

?

?

OC中的用法:

NSString *string = @"Learning";[string boundingRectWithSize:CGSizeMake(CGRectGetWidth(self.view.frame), MAXFLOAT)options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLineattributes:@{NSFontAttributeName : [UIFont systemFontOfSize:12.f]}context:nil];

上面傳值:NSStringDrawingUsesLineFragmentOrigin |?NSStringDrawingTruncatesLastVisibleLine

邏輯處理:

 1     // 對傳入的option邏輯處理
 2     if (option & NSStringDrawingUsesLineFragmentOrigin) {
 3         // 包含   NSStringDrawingUsesLineFragmentOrigin
 4     } else {
 5         // 未包含 NSStringDrawingUsesLineFragmentOrigin
 6     }
 7     if (option & NSStringDrawingTruncatesLastVisibleLine) {
 8         // 包含   NSStringDrawingTruncatesLastVisibleLine
 9     } else {
10         // 未包含 NSStringDrawingTruncatesLastVisibleLine
11     }

?

對于位移枚舉的具體使用方法,建議可以查看一些三方庫,例如SDWebImage等!

轉載于:https://my.oschina.net/u/2320280/blog/729447

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458169.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458169.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458169.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql 關鍵詞相關度排序方法詳細示例分析

http://www.jb51.net/article/40480.htm轉載于:https://www.cnblogs.com/lixiuran/p/5299305.html

數字圖像處理-頻率域濾波原理

from&#xff1a;https://blog.csdn.net/forrest02/article/details/55510711?locationNum15&fps1 寫在前面的話 作者是一名在讀的碩士研究僧&#xff0c;方向是圖像處理。由于圖像處理是一門相對復雜的學科&#xff0c;作者在課堂上學到的東西只是非常淺顯的內容&#…

tomcat優化-有改protocol 和 緩存 集群方案

tomcat優化 在線上環境中我們是采用了tomcat作為Web服務器&#xff0c;它的處理性能直接關系到用戶體驗&#xff0c;在平時的工作和學習中&#xff0c;歸納出以下七種調優經驗。 1. 服務器資源 服務器所能提供CPU、內存、硬盤的性能對處理能力有決定性影響。 (1) 對于高并發…

深入淺出的講解傅里葉變換(真正的通俗易懂)

原文出處&#xff1a; 韓昊 1 2 3 4 5 6 7 8 9 10 作 者&#xff1a;韓 昊 知 乎&#xff1a;Heinrich 微 博&#xff1a;花生油工人 知乎專欄&#xff1a;與時間無關的故事 謹以此文獻給大連海事大學的吳楠老師&#xff0c;柳曉鳴老師&#xff0c;王新年老師以及張晶泊老…

分布式鎖 基于Redis

分布式鎖的實現(基于Redis)參考:http://www.jb51.net/article/75439.htm http://www.linuxidc.com/Linux/2015-01/111827.htm http://www.tuicool.com/articles/6juqmm7 方式一: 基于第三方類庫 redssion 1.安裝redis安裝redssion的鎖服務隊redis的版本有要求&#xff0c;要求必…

學好Linux決心書

我叫李楊&#xff0c;經過在老男孩教育linux運維班5個月學習后&#xff0c;我一定要達到的的薪水目標是7k,為了達到此目標我將采取如下5大行動或方案&#xff1a;1.每天堅持學習7個小時2.堅持每天跑步1小時3.調整思路 嚴于利己4.讓自己生活更加充實&#xff0c;不在渾渾噩噩5.為…

如何通俗易懂地解釋歐拉公式(e^πi+1=0)?

from&#xff1a;https://www.zhihu.com/question/41134540 http://www.matongxue.com/madocs/8.html

IIS(1)

轉載&#xff1a;http://blog.csdn.net/ce123 IIS音頻總線學習&#xff08;一&#xff09;數字音頻技術 一、聲音的基本概念 聲音是通過一定介質傳播的連續的波。 圖1 聲波重要指標&#xff1a; 振幅&#xff1a;音量的大小周期&#xff1a;重復出現的時間間隔頻率&#xff1a;…

手機屏幕適配原理及實現

為什么80%的碼農都做不了架構師&#xff1f;>>> 手機屏幕是用戶與 App 最直接的交互點 不同的分辨率下用戶對我們的 App 具有明顯的感觀差異&#xff0c;主流分辨率的更新迭代卻又完全獨立于 App 進行。這讓我們想要使 App 在絕大多數主流手機上都保持感觀、體驗的…

【數字圖像處理】傅里葉變換在圖像處理中的應用

from&#xff1a;https://www.cnblogs.com/tenderwx/p/5245859.html 1.理解二維傅里葉變換的定義 1.1二維傅里葉變換 二維Fourier變換: 逆變換&#xff1a; 1.2二維離散傅里葉變換 一個圖像尺寸為MN的 函數的離散傅里葉變換由以下等式給出&#xff1a; 其中 和。其中變量u和…

最好的云備份選項

能夠實現數據備份的方式有很多。在虛擬化技術最為興盛的時期&#xff0c;首選方式是使用數據保護軟件&#xff0c;在hypervisor層進行備份或者復制整臺虛擬機&#xff0c;比如Veeam Backup以及Zerto提供的同步軟件。 對于使用VMware云的IT部門來說&#xff0c;這種方式現在仍然…

求二叉樹中兩個節點的最遠距離

問題定義如果我們把二叉樹看成一個圖&#xff0c;父子節點之間的連線看成是雙向的&#xff0c;我們姑且定義"距離"為兩節點之間邊的個數。寫一個程序求一棵二叉樹中相距最遠的兩個節點之間的距離。計算一個二叉樹的最大距離有兩個情況:情況A: 路徑經過左子樹的最深節…

halcon學習(算子匯總)

from:https://www.cnblogs.com/hanzhaoxin/archive/2013/01/09/2852213.html dev_clear_obj(Objects : : : ) 刪除一個iconic對象 dev_error_var( : : ErrorVar, Mode : ) 定義或取消定義一個錯誤變量 dev_get_exception_data( : : Exception, Name : Value) 獲取異常數據…

Bing Speech Recognition 標記

Bing Speech Services Bing Bing Speech Services provide speech capabilities for Windows and Windows Phone https://msdn.microsoft.com/en-us/library/dn303461.aspx 已失效。 轉載于:https://www.cnblogs.com/zangdalei/p/5312440.html

Source Insight 4.0 最簡單的破解安裝

from&#xff1a;https://blog.csdn.net/biubiuibiu/article/details/78044232 三步完成Source Insight 4.0 破解安裝 下載地址有更新&#xff0c;之前有朋友因潛在的版權問題封禁沒下到&#xff0c;現在更新后可正常使用了。 文末有完全清除上次安裝殘留的方法&#xff0c;…

【原】Spark中Master源碼分析(一)

Master作為集群的Manager&#xff0c;對于集群的健壯運行發揮著十分重要的作用。下面&#xff0c;我們一起了解一下Master是聽從Client&#xff08;Leader&#xff09;的號召&#xff0c;如何管理好Worker的吧。 1.家當&#xff08;靜態屬性&#xff09; 1.設置一個守護單線程的…

XML——XML介紹和基本語法

from&#xff1a;https://blog.csdn.net/gavin_john/article/details/51511180 1.XML歷史 gml(1969)->sgml(1985)->html(1993)->xml(1998) 1969 gml(通用標記語言)&#xff0c;主要目的是要在不同的機器之間進行通信的數據規范1985 sgml(標準通用標記語言)1993 htm…

Tomcat7.0安裝配置

很久沒有通過博客對學習所得進行記錄了。 現在將使用Tomcat的一些經驗和心得寫到這里&#xff0c;作為記錄和備忘。如果有朋友看到&#xff0c;也請不吝賜教。 首先&#xff0c;我個人使用的是apache-tomcat-7.0.27你可以下載使用&#xff0c;前提條件你需要安裝JDK1.6或者1.7都…

TIFF圖像文件格式詳解

from&#xff1a;https://www.cnblogs.com/gywei/p/3393816.html 1 什么是TIFF&#xff1f; TIFF是Tagged Image File Format的縮寫。在現在的標準中&#xff0c;只有TIFF存在&#xff0c; 其他的提法已經舍棄不用了。做為一種標記語言&#xff0c;TIFF與其他文件格式最大的不…

java 抽象工廠模式簡單實例

抽象工廠模式&#xff1a;提供一個創建一系列的相關的或者依賴的對象的接口&#xff0c;無需指定它們的具體實現類&#xff0c;具體的時間分別在子類工廠中產生。 類似于工廠模式&#xff1a;隔離了具體類的生產實現&#xff0c;使得替換具體的工廠實現類很容易。包含有以下模塊…