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

来源:https://www.cnblogs.com/shikaiming/archive/2019/10/15/11678725.html
-Advertisement-
Play Games

1. 應該用枚舉表示狀態機的狀態、傳遞給方法的選項以及狀態碼等值,給這些值起個易懂的名字,就像監聽網路狀態的枚舉。 2. 如果把傳遞給某個方法的選項表示為枚舉類型,而多個選項又可同時使用,那麼就將各選項定義為2的冪,以便通過按位或操作將其組合起來。 3. 用 NS_ENUM 與 NS_O... ...


枚舉(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語句並未處理所有枚舉。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 創建資料庫 在MySQL中,使用 CREATE DATABASE 或 CREATE SCHEMA 語句創建資料庫 語法結構: : 表示為可選 : 用於分隔花括弧中的選項,表示任選一項語法 : 標識具體的資料庫命名,必須符合操作系統文件夾命名規則,在MySQL中不區分大小寫 : 預設值 : 指定資料庫 ...
  • 現需要限定特定的用戶只能查看並訪問特定的資料庫,防止多個用戶對資料庫操作時一些誤操作。 參考i6first的如何讓用戶只能訪問特定的資料庫(MSSQL)博文 1.新建登錄用戶 以管理員身份登陸資料庫(許可權最高的身份如sa),點擊安全性->登錄名,右鍵新建登錄名,輸入登錄名和密碼,取消強制實施密碼策略 ...
  • 1、去官網查找最新(你需要的)安裝包版本 # https://dev.mysql.com/downloads/repo/yum/ 2、下載MySQL安裝包 # wget http://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.r ...
  • 概述 數據完整性指資料庫中數據的 正確性、相容性和一致性 。包括現實世界中的應用需求的完整性。數據的完整性由完整性規則來定義。 關係模型的完整性規則是對關係的某種約束,提供一種手段來保證用戶對資料庫的修改時不會破壞資料庫中數據的完整性。保證數據是有意義的。 關係模型分三類約束:實體完整性約束、參照完 ...
  • 在SQL Server中重建索引(Rebuild Index)與重組索引(Reorganize Index)會觸發統計信息更新嗎? 那麼我們先來測試、驗證一下: 我們以AdventureWorks2014為測試環境,如下所示: Person.Person表的統計信息最後一次更新為2014-07-17... ...
  • 本文基於 Android 9.0 , 代碼倉庫地址 : "android_9.0.0_r45" 文中源碼鏈接: "SystemServer.java" "ActivityManagerService.java" "Process.java" "ZygoteProcess.java" 對 和 啟動流程 ...
  • 1. 在對象內部讀取數據時,應該直接通過實例變數來讀,而寫入數據時,則應通過屬性來寫。 2. 在初始化方法及dealloc方法中,總是應該直接通過實例變數來讀寫數據。 3. 使用Lazy Initialization配置的數據,應該通過屬性來讀取數據。 4. 不要在setter/g... ...
  • 1. 可以用@property語法來定義對象中所封裝的數據。 2. 通過“修飾詞”來指定存儲數據所需的正確語義。 3. 在設置屬性所對應的實例變數時,一定要遵從該屬性所聲明的語義。 4. 開發iOS程式時應該使用nonatomic屬性,因為atomic(同步鎖)屬性嚴重影響性能。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...