建議4:iOS優先使用對象字面量語法而非等效方法

很多剛從其他編程語言轉到Objective-C的程序員,往往看到長長的函數名就會覺得感到崩潰,這種語法讓消息的傳遞像一個英語句子,雖有不足但確實大大增強了可讀性。比如想初始化一個浮點數,需要這么寫:

NSNumber * value = [NSNumber numberWithFloat:123.45f];

從這句中能夠明確的知道代碼的含義,但是,是否連簡單的賦值語句都需要這么處理呢?對象的字面量,能夠幫助iOS程序員更加高效的編寫代碼。在Xcode4.4版本中,這個特性已經可以使用了。

對象的字面量語序方便的定義數字,數組和字典對象。這個功能類似于Java 5提供的auto boxing功能。這雖然是一個語法改進,但是對提高寫代碼的效率有很大的幫助。蘋果本次的新特性中采用了折中的處理方式,針對很對基礎類型,采用了簡寫的方式,實現語法簡化。簡化以后,會發現語法層面上,簡化的OC更像Python和Ruby等動態語言的語法了。

NSNumber * number = @1;
NSArray * array = @[@"one",@"two"];
NSDictionary * dict = @{@"key1": @"value1",@"key2",@"value2",@"key3",@"value3"};

下面逐一介紹
1.數字(NSNumber)
簡化后的寫法:

NSNumber * value;
value = @12345;
value = @123.45f;
value = @123.45;
value = @YES;

裝箱表達式也可以采用類似的寫法:

NSNumber * piOverSixteen = @(M_PI / 16);
NSString * path = @(getenv("PATH"));

對于字符串表達式來說,需要注意的是,表達式的值一定不能是NULL,否則會拋出異常。

2.數組(NSArray)
對于NSArray的初始化來說,有非常多的寫法,這里就不一一羅列,直接看新的寫法。

NSArray * array;
array = @[];//空數組
array = @ [ a ];//一個對象的數組
array = @[a,b,c];//多個對象的數組

非常簡單,再也不用記住初始化多個對象的數組時,后面還要跟個nil。仙子看一下你當生命多個對象的數組時,編譯器是如何處理的。

array = @[a,b,c];

編譯器生成的代碼:

id  objects[] = {a,b,c};
NSUInterger count = sizeof(objects) /sizeof(id);
array = [NSArray arrayWithObjects:objects count:count];

編譯器把簡單重復的工作都做了,不過有一點需要注意,如果a,b,c對象有nil的時候,會拋出異常,這點和原來的處理方式不能,編碼時候要多加小心。

3.字典(NSDictionary)
同樣,對于字典這個數據結構來說,有很多種初始化方式,來看新寫法。

NSDictionary * dict;
dict = @{};
dict = @{ k1 : o1};
dict = @{k1:o1,k2:o2,k3:o3};

4.下標法與容器類
容器的語法簡化讓人不難想到,可以通過下標的方式存取數組和字典的數據。比如對于數組:

NSArray * array = @[a,b,c];

可以這樣寫:

id obj = array[i];
array[i] = newObj;

對于字典:

id obj = dict[k2];
dic[k2] = newObj;

同時,自定義的容器類只要實現規定的下標方法,就可以采用下標的方式訪問數據。要實現的方法如下。
數組類型的下標方法:

- (elementType)objectAtIndexedSubscript:(indexType)idx;
- (void)setObject:(elementType)object atIndexedSubscript:(indexType)idx;

字典類型的下標方法:

- (elementType)objectForKeyedSubscript:(keyType)key;
- (void)setObject:(elementType)object forKeyedSubscript:(keyType)key;

其中需要注意的是,indexType必須是整數,elementType和keyType必須是對象指針。
5.容器類數據結構轉換限制
采用上述寫法構建的容器類都是不可變的,如果需要生成可變的容器,可以傳遞-mutable Copy消息。例如:

NSMutableArray * mutablePlanets = [@[@"Mercury",@"Venus",@"Earth",@"Mars",@"Jupiter",@"Saturn",@"Uranus",@"Neptune"]mutableCopy];

不能對常量數組直接賦值,解決辦法是在類方法(void)initialize中進行賦值處理。如下:

@implementation MyClass
static NSArray * thePlanets;
+ (void)initialize {
    if (self == [MyClass class]) {
         thePlanets =    @[@""Mercury",@"Venus",@"Earth",@"Mars",@"Jupiter",@"Saturn",@"Uranus",@"Neptune""];
    }  
}}

要點###

(1)盡量使用字面量語法來創建字符串,數字,數組和字典等,使用它比使用以前常規對象創建方法更為精簡,同時可以避免一些常見的陷阱。
(2)對象字面量語法特性是完全可以向下兼容的,使用新特性編寫出來的代碼,經過編譯后形成的二進制程序可以運行在之前發的任何OS中。
(3)在數字和字典中,要使用關鍵字和索引做下標來獲取數據。
(4)使用對象字面量語法時,容器類的不可是nil,否則運行的時候會拋出異常。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容