<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在編寫程式碼時經常要使用常數,來替代 magic number。比較簡單的做法是通過預處理指令 #define
來實現。
#define ANIMATION_DURATION 0.3
上述預處理指令會在編譯時的預處理階段會將程式碼中 ANIMATION_DURATION
字串替換為 0.3
。這種定義常數的方式比較簡便,但是存在兩個問題:
ANIMATION_DURATION
都會被替換,可能出現衝突。幸運的是,Objective-C
中提供了 const
關鍵字,可以用來定義常數。const
關鍵字可以對變數加以限定,使其值不能被改變,在整個作用域中都保持固定。
const NSTimeInterval kAnimationDuration = 0.3;
這種方式定義的常數包含型別資訊,且在編譯時即可檢查是否與其他常數出現衝突。如果試圖修改由 const
修飾符所宣告的變數,那麼編譯器就會報錯。
如果常數僅在某個實現檔案中使用,還應該加上 static
關鍵字,否則會被視為全域性常數。若不使用 static
,編譯器會為它建立一個外部符號,若另一個編譯單元中也宣告了同名變數,就會報錯。
static const NSTimeInterval kAnimationDuration = 0.3;
當一個變數同時使用了 static
和 const
,那麼編譯器並不會建立符號,而是會像 #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_EXPORT
和 FOUNDATION_IMPORT
是用來相容 Win32
應用程式的,行動端開發可以忽略。
所以上述對全域性常數的宣告,可以寫成:
// .h FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidResumeNotification; // .m NSString * const AFNetworkingTaskDidResumeNotification = @"com.alamofire.networking.task.resume";
使用過 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常數的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45