91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Objective-C?const常量如何使用

發布時間:2022-08-08 13:40:17 來源:億速云 閱讀:112 作者:iii 欄目:開發技術

這篇文章主要介紹了Objective-C const常量如何使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Objective-C const常量如何使用文章都會有所收獲,下面我們一起來看看吧。

正文

在編寫代碼時經常要使用常量,來替代 magic number。比較簡單的做法是通過預處理指令 #define 來實現。

#define ANIMATION_DURATION 0.3

上述預處理指令會在編譯時的預處理階段會將代碼中 ANIMATION_DURATION 字符串替換為 0.3。這種定義常量的方式比較簡便,但是存在兩個問題:

  • 丟失了類型信息。

  • 若該預處理指令聲明在頭文件中,引入該頭文件的代碼,ANIMATION_DURATION 都會被替換,可能出現沖突。

Objective-C 的常量聲明方式

幸運的是,Objective-C 中提供了 const 關鍵字,可以用來定義常量。const 關鍵字可以對變量加以限定,使其值不能被改變,在整個作用域中都保持固定。

const NSTimeInterval kAnimationDuration = 0.3;

這種方式定義的常量包含類型信息,且在編譯時即可檢查是否與其他常量出現沖突。如果試圖修改由 const 修飾符所聲明的變量,那么編譯器就會報錯。

如果常量僅在某個實現文件中使用,還應該加上 static 關鍵字,否則會被視為全局常量。若不使用 static,編譯器會為它創建一個外部符號,若另一個編譯單元中也聲明了同名變量,就會報錯。

static const NSTimeInterval kAnimationDuration = 0.3;

當一個變量同時使用了 staticconst,那么編譯器并不會創建符號,而是會像 #define 預處理指令一樣,把所有遇到的變量替換為常值。

有時候需要把一個常量暴露給外界使用,比如通知,此類常量需放在全局符號表中。可以使用 extern 關鍵字,在頭文件中進行聲明:

// .h
extern NSString * const AFNetworkingTaskDidResumeNotification;
// .m
NSString * const AFNetworkingTaskDidResumeNotification = @"com.alamofire.networking.task.resume";

該常量在頭文件中聲明,在實現文件中定義。需要注意的是 const 寫在指針類型的右邊意味著該指針的指向不可被改變,若寫在左邊意味著該指針指向的內容不可被改變。

按上述方式實現并定義后,在編譯時生成目標文件時,編譯器會在數據段為字符串分配存儲空間。

Foundation 框架中,蘋果為了兼容 C++ 中對 extern 的使用,提供了宏:

#if defined(__cplusplus)
#define FOUNDATION_EXTERN extern "C"
#else
#define FOUNDATION_EXTERN extern
#endif
#define FOUNDATION_EXPORT FOUNDATION_EXTERN
#define FOUNDATION_IMPORT FOUNDATION_EXTERN

一個 C++ 程序中可能包含其他語言編寫的部分代碼,同樣,C++ 編寫的代碼片段也可能被用在其他語言編寫的代碼中。但是,不同語言編寫的代碼相互調用是困難的,更何況用同一種語言編寫,使用不同編譯器進行編譯的情況。因為,不同語言或者同種語言在不同編譯器上編譯時,在注冊變量,傳遞參數和參數在棧上的布局上可能存在差異。

為了使它們遵守統一規則,可以使用 extern 指定一個編譯和鏈接規約。extern "C" 指令中的 C,表示的是一種編譯和鏈接規約,而不是一種語言。C 表示符合 C 語言的編譯和鏈接規約的任何語言。

還要說明的是,extern "C" 指令指定的編譯和鏈接規約,不會影響語義,只是改變編譯和鏈接的方式。

FOUNDATION_EXPORTFOUNDATION_IMPORT 是用來兼容 Win32 應用程序的,移動端開發可以忽略。

所以上述對全局常量的聲明,可以寫成:

// .h
FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidResumeNotification;
// .m
NSString * const AFNetworkingTaskDidResumeNotification = @"com.alamofire.networking.task.resume";

在 Objective-C 中使用 let 來聲明常量

使用過 Swift 的同學,一定對其聲明常量的方式的簡潔性印象深刻,在 Swift 中聲明常量的方式如下所示:

let kAnimationDuration = 0.3

之所以能如此簡潔,是因為 Swift 具有 let 關鍵字和類型推斷的能力,但其實在 Objective-C 中也可以通過類似的方式來書寫常量。

Objective-C 中有一個關鍵字,是 __auto_type,可以實現類似 Swift 中類型推斷能力的關鍵字,如下所示:

const __auto_type kAnimationDuration = 0.3;

可能對于簡單的數據類型,這樣的優勢不是很明顯,但是對于具有復雜泛型的類型來說,可以說優勢很大了:

// 舊方式
NSArray<NSDictionary<NSString *, NSString *> *> *models = ...;
// 新方式
__auto_type models = ...;

同時,可以通過宏的方式,來減少 __auto_type 的書寫,即可實現通過 let 聲明常量,var 聲明變量。其中 auto 關鍵字是為了兼容 C++。

#if defined(__cplusplus)
#define let auto const
#else
#define let const __auto_type
#endif
#if defined(__cplusplus)
#define var auto
#else
#define var __auto_type
#endif

聲明了上面的宏之后,就可以直接使用了:

let kAnimationDuration = 0.3;

關于“Objective-C const常量如何使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Objective-C const常量如何使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

浦北县| 太和县| 莱芜市| 和政县| 沙田区| 留坝县| 安宁市| 新邵县| 措美县| 额尔古纳市| 武隆县| 平陆县| 溆浦县| 吴堡县| 乌审旗| 巩义市| 文昌市| 八宿县| 故城县| 芜湖市| 安远县| 阳春市| 怀集县| 射洪县| 钟山县| 德州市| 丰镇市| 读书| 六盘水市| 永丰县| 灯塔市| 康保县| 崇文区| 郴州市| 宿州市| 大渡口区| 伊春市| 惠水县| 襄城县| 达拉特旗| 莒南县|