1. 程式人生 > >iOS 中的巨集定義,常量,與列舉型別使用

iOS 中的巨集定義,常量,與列舉型別使用

開發過程中的經常需要使用一些全域性的常量,便於方法之間的引數傳遞和型別確定等,經常使用到的有巨集定義,const常量以及列舉等,我們經常使用巨集定義來進行全域性常量的定義,但是是不是所有的全域性常量巨集定義都是最好的選擇呢?

巨集定義是我們最經常使用的全域性常量定義方法,使用非常便捷,在使用過程中需要注意以下事項:

1.巨集定義是預編譯處理,在程式開始編譯之前就已經完成;

2.巨集定義只是進行字元替換,並沒有優先順序限制,比如

#define add(x,y)x + y

在使用時如果使用了add(3,4)*add(3,4),巨集定義替換之後的結果是3+4*3+4=19,而不是(3+4)*(3+4) =49,一定要注意!!!

3.巨集定義不做型別的語法檢查,巨集定義中巨集的所有引數都是沒有型別的,可能會存在重複定義的問題,如果重複定義了相同名稱的巨集,程式只是會給出警告,而不會影響編譯,所以如果你定義了同名稱兩個巨集,而替換方式不一樣的話,是很難發現的。

4.巨集定義不是變數定義,所以並不分配記憶體;

5.巨集定義只是字串替換,結尾不需要使用使用分號結束。

const是變數修飾符號,在定義全域性變數的時候,應該優先考慮static加上const來替換巨集定義常量,原因有以下幾點:

1.當專案比較大的時候,過多的巨集定義會使專案的編譯變得緩慢;

2.const修飾變數在編譯期間會進行語法檢查,可以防止意外的型別錯誤,以及重複定義,可以使定義更加安全;

3.const修飾變數時,該變數不允許改變,可以防止常量被意外修改;

4.在需要使用的地方,只需要使用extern關鍵字擴大變數的作用域,使得變數的訪問更加靈活。

對於const的使用,需要注意以下事項:

1.const修飾普通變數,表示該變數為常量,使用過程中不允許修改;

2.const修飾指標類變數;含有地址的變數時,以*分為左右兩部分,左側部分含有const修飾符號時,該地址內容不能改修;右側部分還有const修飾時,該變數地址不能改變,如果兩側都有const修飾,則記憶體地址和地址內容都不可變;

3.const可以修飾形參,被修飾的引數在方法內部不能被修改;

4.被const修飾的變數的作用域,可以通過extern進行擴充套件,不需要進行初始化和分配空間,只是告訴編譯起該變數會在其他地方進行定義。

對於互斥(不能同時具有兩種狀態)表示的多種整型變數,一般推薦使用NS_ENUM來表示,使用很簡潔,也很方便。比如文字在豎直方向的對齊狀態

typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) {

    UIControlContentVerticalAlignmentCenter  = 0,

    UIControlContentVerticalAlignmentTop     = 1,

    UIControlContentVerticalAlignmentBottom  = 2,

    UIControlContentVerticalAlignmentFill    = 3,

};

這種表示的優點是可以將多種實用普通整型數字不易區分的狀態,用易於區分的字串表示,見名知意,不易出錯,方便表示。但是這種表示方法的不足之處就是各種狀態之間不能並存,但是有些時候我們需要使用多種狀態同時存在,比如選擇了一個通訊錄裡的聯絡人需要獲取的資訊型別

typedef NS_OPTIONS(NSUInteger, APContactField)

{

    APContactFieldFirstName        = 1 << 0,

    APContactFieldLastName         = 1 << 1,

    APContactFieldCompany          = 1 << 2,

    APContactFieldPhones           = 1 << 3,

    APContactFieldEmails           = 1 << 4,

    APContactFieldPhoto            = 1 << 5,

    APContactFieldThumbnail        = 1 << 6,

    APContactFieldPhonesWithLabels = 1 << 7,

    APContactFieldCompositeName    = 1 << 8,

    APContactFieldAddresses        = 1 << 9,

    APContactFieldRecordID         = 1 << 10,

    APContactFieldCreationDate     = 1 << 11,

    APContactFieldModificationDate = 1 << 12,

    APContactFieldMiddleName       = 1 << 13,

    APContactFieldSocialProfiles   = 1 << 14,

    APContactFieldNote             = 1 << 15,

    APContactFieldLinkedRecordIDs  = 1 << 16,

    APContactFieldJobTitle         = 1 << 17,

    APContactFieldWebsites         = 1 << 18,

    APContactFieldBirthday         = 1 << 19,

    APContactFieldSource           = 1 << 20,

    APContactFieldRelatedPersons   = 1 << 21,

    APContactFieldEmailsWithLabels = 1 << 22,

    APContactFieldDefault          = APContactFieldFirstName | APContactFieldLastName |

APContactFieldPhones | APContactFieldRecordID,

    APContactFieldAll              = 0xFFFFFFFF

};

如果你需要同時選定姓名和聯絡方式,只需要定義 _enums = APContactFieldFirstName|APContactFieldLastName|APContactFieldPhones就可以了,

那麼問題來了,對於這種可以同時選擇多個屬性的列舉型別,如何確定某個列舉值(比如APContactFieldFirstName)是不是包含在選定列舉(比如_enums)中呢?

只需要將(APContactFieldFirstName)&(_enums)運算,如果其值為真,則包含,否則為假。

相關推薦

iOS 巨集定義常量列舉型別使用

開發過程中的經常需要使用一些全域性的常量,便於方法之間的引數傳遞和型別確定等,經常使用到的有巨集定義,const常量以及列舉等,我們經常使用巨集定義來進行全域性常量的定義,但是是不是所有的全域性常量巨

java map常量定義 Java定義Map常量List常量

https://www.cnblogs.com/leonxiaosi/p/6928604.html   Java中定義Map常量,List常量 一般的方式的使用靜態程式碼塊。比如:

C++巨集定義字串拼接標誌貼上

關於記號貼上操作符(token paste operator): ## 1. 簡單的說,“##”是一種分隔連線方式,它的作用是先分隔,然後進行強制連線。其中,分隔的作用類似於空格。我們知道在普通的巨集定義中,前處理器一般把空格解釋成分段標誌,對於每一段和前面比較,相同的

vue2.0在頁面定義元件模組以及頁面元件之間的資料傳遞

1.在頁面上引入寫好的元件import UpdataPassword from './updataPassWord'       //updataPassWord為元件的name2.註冊元件components:{               //註冊元件  UpdataPa

IOS公布應用程序進度條一直不走怎麽處理

sso pan arch 技術分享 成功 csdn 版本 進度條 div 在IOS中公布應用程序非常是喜聞樂見。近期1周。我更新了6次版本號。可是時不時的會卡住,進度條不走。最後總結了幾個原因。 1.在公布前你要確認自己的證書是否配置正確 2.DNS域名server有沒

開始PHP常量/變數記憶體間的關係--傳值

一.常見的PHP程式碼嵌入式方式,與html結合 要注意:檔名字尾必須形如xxx.php否則html將無法解析 二.php脫離html程式碼獨立工作,沒有其他程式碼 不需要藉助Apache工作,只需要php引擎;通過php.exe去執行php檔案 方式2帶來的問題是:只能由伺服器訪問,而方式一

GCC編譯時增加巨集定義-D識別符號相當於巨集定義#define 識別符號

GCC編譯時增加巨集定義-D<識別符號>,相當於#define <識別符號>,可以在遇到條件編譯時執行。 #ifdef <識別符號> //條件編譯內容 #

由為什麼介面只能定義靜態常量引發的介面抽象類的區別的問答

1、為什麼必須是靜態的:由於介面不能例項化,非靜態成員只能使通過例項呼叫,所以必須定義為static靜態的 2、為什麼抽象類也不能被例項化,但抽象類裡面可以定義非靜態的:由於子類與抽象類的關係中,子類繼承(extends)抽象類, java中,子類繼承父類,子類例項化,首

iOS手動匯出dSYM檔案用於解析崩潰日誌

符號表檔案.dSYM實際上是從Mach-O檔案中抽取除錯資訊而得到的檔案目錄,實際用於儲存除錯資訊的檔案是DWARF,其出身可以從這篇文章瞭解。 這個是我T9專案匯出的檔案路徑 /Appl

c語言定義常量定義的區別

沒有 int 符號表 cnblogs 格式 nbsp 參數 不同之處 區別   他們有共同的好處就是“一改全改,避免輸入錯誤”哪兩者有不同之處嗎?有的。   主要區別就在於,宏定義是在編譯之前進行的,而const是在編譯階段處理的 宏定義不占用內存單元而const定義的常量

01.Java關鍵字常量變量數值類型

ati 標識 類繼承 大寫 起名字 運行 native 顯示錯誤 第一個 2.1.關鍵字 1.用於定義訪問權限修飾符的關鍵字:private ,protected ,public 1)private (私有的): private 關鍵字是訪問控制修飾符,可以應用於類、方法

三:go語言變數常量列舉布林

1:一個包下面可以有多個人原始檔 2:import按照書序匯入載入(優先執行檔案裡的init方法) 3:類型別名不能參加正常運算(要同一個型別的前提下才行) 4:申明的變數沒有使用,也會報錯 5:定義包名 -> 最好資料夾唯獨定義包名 6:var a,b,c = 11,21,31

Java儲存機制——棧、堆區別(變數常量String舉例)

Java的6種儲存儲存地址及其解釋   暫存器(register):這是最快的儲存區,因為它位於不同於其他儲存區的地方——處理器內部。但是暫存器數量極其有限,所以暫存器根據編譯器需求來進行分配,我們無法控制。 堆疊(常稱為棧:stack):位於通用RAM中。它通過它的“

VS2008定義C++工程模板修改新建檔案預設編碼的辦法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

iOS開發巨集定義(#define)注意

在開發中常用#define來記錄各種數值,一般情況下是沒有問題的,但是當巨集中有加減運算,並被用於乘除等運算中時計算的數值就可能不準確。 舉例 #define kItemWith self.bounds.size.height - 10 這裡定義了一個item的長度,正常情

JAVA基礎----變數常量運算子

一:資料型別 java資料型別分為簡單型別和引用型別。 以下為資料型別分類: 二:裝箱和拆箱 1.byte:初始值:0 包裝類:Byte; char:初始值:\u0000 包裝類:Character short:初始值:0 包裝類:Character int:初始值:0 包裝類:Integ

關鍵字識別符號註釋常量進位制轉換變數

關鍵字 被Java語言賦予特定含義的單詞。 特點: 組成關鍵字的字母全部小寫。 注意事項: A:goto和const作為保留字存在,目前並不使用。注意:保留字在jdk的新版本中可能會提升為關鍵字。 B:類似於Notepad++這樣的高階記事本會對關鍵字有特殊顏色標記。 例項程式碼

C語言巨集定義和函式的取捨

原文連結:http://www.embedu.org/Column/Column177.htm 要寫好C語言,漂亮的巨集定義是非常重要的。巨集定義可以幫助我們防止出錯,提高程式碼的可移植性和可讀性等。 在軟體開發過程中,經常有一些常用或者通用的功能或者程式碼段,這些功能既可以寫成函式,也可以

iOS 使用巨集定義函式和程式碼塊

iOS使用巨集定義函式和程式碼塊 今天在開發過程中碰到一個問題:就是父類中要向外傳送通知,然後子類中或者其他類中來接收它。當然一般是把它寫到類方法中去,但是有個問題,就是如果呼叫的類不是它的子類,就不能直接呼叫,當然也可以採用靜態方法實現,我這裡主要是想用巨集

Java程式設計如何定義全域性常量

Class定義常量方法(推薦方法) //final修飾符 public final class Constants { //私有構造方法 private Constants() {} public static final int Constant