標籤:

第五條:用枚舉表示狀態、選項、狀態碼

第五條:用枚舉表示狀態、選項、狀態碼

由於Objective-C基於C語言,所以C語言有的功能它都有。其中之一就是枚舉類型:enum。系統框架中頻繁用到此類型,下面是枚舉的用法:

//UIView的動畫效果枚舉值typedef NS_ENUM(NSInteger, UIViewAnimationCurve) { UIViewAnimationCurveEaseInOut, // slow at beginning and end UIViewAnimationCurveEaseIn, // slow at beginning UIViewAnimationCurveEaseOut, // slow at end UIViewAnimationCurveLinear,};// 這樣枚舉值的定義可以組合使用,用"按位與操作符"即可判斷出是否已啟用某個選項:typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) { UIViewAutoresizingNone = 0, UIViewAutoresizingFlexibleLeftMargin = 1 << 0, UIViewAutoresizingFlexibleWidth = 1 << 1, UIViewAutoresizingFlexibleRightMargin = 1 << 2, UIViewAutoresizingFlexibleTopMargin = 1 << 3, UIViewAutoresizingFlexibleHeight = 1 << 4, UIViewAutoresizingFlexibleBottomMargin = 1 << 5};//使用如下:enum UIViewAutoresizing resizing = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

有一種枚舉的用法,就是在switch語句里,

switch (resizing) { case UIViewAutoresizingFlexibleHeight: break; case UIViewAutoresizingFlexibleWidth: break; case UIViewAutoresizingFlexibleTopMargin: break; case UIViewAutoresizingFlexibleLeftMargin: break; case UIViewAutoresizingFlexibleRightMargin: break; case UIViewAutoresizingFlexibleBottomMargin: break;}

總共的枚舉值有 7 種,在 switch 中只寫出了 6 種,而且沒有 default case 選項,編譯器就會提示警告:

Enumeration value UIViewAutoresizingNone not handled in switch

提示還有狀態並未在switch分支中處理。,假如寫上了default分支,那麼它就會處理這個沒有寫完的狀態,這個技巧同時適用與在 enum 中添加新的狀態

要點

  • 應該用枚舉來表示狀態機的狀態、傳遞給方法的選項以及狀態碼等值,給這些值起個易懂的名字
  • 如果把傳遞給某個方法的選項表示為枚舉類型,而多個選項又可同時使用,那麼就將個選項值定義為2的冪,以便通過按位或操作將其組合起來。
  • 用NSENUM 與NSOPTIONS宏來定義枚舉類型,並指明其底層數據類型。這樣做可以確保枚舉是用開發者所選的底層數據類型實現的,而不會採用編譯器所選的類型
  • 在處理枚舉類型的 switch 語句中不要實現default分支。這樣的話,加入新枚舉之後,編譯器就會提示開發者:switch 語句並未處理所有枚舉。

推薦閱讀:

iPhone越更新越卡慢,真正的原因是?
學習 iOS 開發,剛準備起步,需要立即買 Mac 嗎?
蘋果ios系統有哪些優點?
Windows Phone 7 系統的使用體驗,相對 Android 和 iOS 來說,有哪些優劣之處?
iOS 里 App Store 的「Genius 應用軟體推薦」需要付費嗎?

TAG:iOS |