52個有效方法(5) - 用枚舉表示狀態、選項、狀態碼


枚舉(enum)

  • 枚舉(enum)只是一種常量的命名方式。是C語言中的一種基本數據類型,是一個"被命名的整型常量"的集合。

  • 規范的定義代碼中的狀態、選項等“常量”。

  • 不參與內存的占用和釋放。

  • 在開發中使用枚舉的目的,是為了增加代碼的可讀性。

NS_ENUMNS_OPTIONS 宏來定義枚舉類型,並指明其底層數據類型。

  • NS_ENUM

    NS_ENUM一般用來定義默認的枚舉值

/* NS_ENUM supports the use of one or two arguments. The first argument is always the integer type used for the values of the enum. The second argument is an optional type name for the macro. When specifying a type name, you must precede the macro with 'typedef' like so:
 
typedef NS_ENUM(NSInteger, NSComparisonResult) {
    ...
};
 
If you do not specify a type name, do not use 'typedef'. For example:
 
NS_ENUM(NSInteger) {
    ...
};
*/
 
#define NS_ENUM(...) CF_ENUM(__VA_ARGS__)
  • NS_OPTIONS

    NS_OPTIONS一般用來定義位移相關操作的枚舉值

#define NS_OPTIONS(_type, _name) CF_OPTIONS(_type, _name)

枚舉(Enum)與狀態(states)

某個對象所經歷的各種狀態可以定義為一個的枚舉集(enumeration set)

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
    UIViewAnimationTransitionNone,
    UIViewAnimationTransitionFlipFromLeft,
    UIViewAnimationTransitionFlipFromRight,
    UIViewAnimationTransitionCurlUp,
    UIViewAnimationTransitionCurlDown,
};
  • 編譯器會為每個枚舉值分配一個獨有的編號,從0開始,依次加1

  • 一個字節最多可表示0~255256種(2^8)枚舉變量。

枚舉(enum)與選項(options)

在定義選項的時候,應該使用枚舉類型。若這些選項可以彼此組合,則更應如此。只要枚舉定義得對,各選項之間就可以通過 “按位或操作符”來組合。

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
};
  • 選項是用位運算的方式定義的
UIViewAutoresizingNone                            0 0 0 0 0 0 0 0
UIViewAutoresizingFlexibleLeftMargin              0 0 0 0 0 0 0 1
UIViewAutoresizingFlexibleWidth                   0 0 0 0 0 0 1 0
UIViewAutoresizingFlexibleRightMargin             0 0 0 0 0 1 0 0
UIViewAutoresizingFlexibleTopMargin               0 0 0 0 1 0 0 0
UIViewAutoresizingFlexibleHeight                  0 0 0 1 0 0 0 0
UIViewAutoresizingFlexibleBottomMargin            0 0 1 0 0 0 0 0
UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight 
                                                  0 0 0 1 0 0 1 0
  • <<帶符號左移 (n<<2 將整型值帶符號左移2位 )

    • 將一個運算符對象的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0

    • 操作數每左移一位,相當於該數乘以2

    • 例如:3<<2 后,結果為12
      3的二進制位11,左移兩位后,右邊補2個0就是11001100轉為10進制為12

    • 左移操作就相當於22次方×3。 每左移1位次方就增1

  • >>帶符號右移 (n>>2 將整型值帶符號右移2位 )

    • 將一個數的各二進制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。

    • 操作數每右移一位,相當於該數除以2 ,然后取整

    • 例如:9>>1 后,結果為4
      9的二進制為1001,右移1位后,左正數補0,右邊丟棄。結果為 0100。轉為10進制后為4

枚舉(enum)與狀態碼(codes)

枚舉用法也可用於 switch 語句。在處理枚舉類型的switch語句中不要實現default分支。

typedef NS_ENUM(NSUInteger, EOCConnectionState) {
    EOCConnectionStateDisconnected,
    EOCConnectionStateConnecting,
    EOCConnectionStateConnected
};

switch (_currentState) {
    EOCConnectionStateDisconnected:
      //...
      break;
    EOCConnectionStateConnecting:
      //...
      break;
    EOCConnectionStateConnected:
      //...
      break;
}

要點

  1. 應該用枚舉表示狀態機的狀態、傳遞給方法的選項以及狀態碼等值,給這些值起個易懂的名字,就像監聽網絡狀態的枚舉。

  2. 如果把傳遞給某個方法的選項表示為枚舉類型,而多個選項又可同時使用,那么就將各選項定義為2的冪,以便通過按位或操作將其組合起來。

  3. NS_ENUMNS_OPTIONS 宏來定義枚舉類型,並指明其底層數據類型。這樣可以確保枚舉是用開發者所選的底層數據類型實現出來的,而不會采用編譯器所選的類型。

  4. 在處理枚舉類型的switch語句中不要實現default分支。這樣的話,加入新枚舉之后,編譯器就會提示開發者:switch語句並未處理所有枚舉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM