3: 多用字面量語法, 少用與之等價的方法

Objective-C以復雜的語法著稱,某些實現(xiàn)不是那么簡潔好用.不過使用字面量語法有時候就很方便很簡潔,有一個非常簡單的方式創(chuàng)建NSString對象,那就是"字符串字面量",其語法如下:

//字面字符串
NSString *str = @"Objective-C is the best programming language";

當然不用這樣的語法的話,使用常見的alloc及init方法來分配并初始化NSString對象.但是使用字面量語法(literal syntax)可以縮減源代碼的長度,使其可讀性提高。同樣,使用這種字面量語法也可以來聲明NSNumber, NSArray, NSDictionary類的實例.

字面數值

簡單數值類型封裝成NSNumber對象.比如集嵌,我們把整數, 浮點數, 布爾值封入Objective-C對象中.這種情況下:

一般做法:

NSNumber *num = [NSNumber numberWithInt:3];

字面量語法:

NSNumber *num = @1;

字面量語法能做到的不僅如此,能以NSNumber實例表示的所有數據類型都可以使用字面量語法來表示,例如:

NSNumber *intNum = @3;
NSNumber *floatNum = @3.3f;
NSNumber *doubleNum = @3.33333;
NSNumber *boolNum = @YES;
NSNumber *charNum = @'a';

同時字面量語法也適用于表達式:

int a = 3;
float b = 3.33f;
NSNumber *expressionNum = @(a * b);

用字面量來表示數值十分有用,這樣做可以使NSNumber更為簡潔,可讀性更高,因為其中只有數字,沒有其他多余成分.

字面量數組

通常創(chuàng)建數組方法:

NSArray *array = [NSArray arrayWithObjects:@"one", @"two", @"three"];

字面量語法創(chuàng)建數組:

NSArray *array = @[@"one", @"two", @"three"];

這種做法不僅簡單,而且還有利于操作數組,數組最常見的操作就是通過某個下標取得對應的對象,如果不適用"字面量語法",通常會用"objectAtIndex:"方法:

NSString *string = [array objectAtIndex:0];

使用字面量則是:

NSString *string = array[0];

這樣的做法簡單明了,更容易理解.也和其他語言中訪問數組中的某個元素類似.

注意:

使用字面量語法創(chuàng)建數組時,若數組元素對象中有nil,則會拋出異常.因為字面量語法其實是一種"語法糖"(語法糖可以使程序的可讀性提高,同時減少代碼出錯率).其效果等于先創(chuàng)建了一個數組,然后把方括號中的所有對象都加到這個數組中.

舉個例子:

id object1 = /* ... */;
id object2 = /* ... */;
id object3 = /* ... */;
NSArray *arrayA = [NSArray arrayWithObjects:object1, object2, object3];
NSArray *arrayB = @[object1, object2, object3];

不妨思考一下:如果object1和object3都指向了有效的Objective-C對象,而object2是nil,會出現(xiàn)什么情況?如果采用字面量語法,創(chuàng)建arrayB時會拋出異常(attempt to insert nil object from arrayB[1]),arrayA雖然能創(chuàng)建成功,但是其中只有一個object1對象,原因很簡單:arrayWithObjects:方法會依次處理每個參數,直到發(fā)現(xiàn)nil為止.

這個差別表明:使用字面量語法更為安全.拋出異常令程序終止,這比創(chuàng)建好數組發(fā)現(xiàn)數組中元素個數不對要好很多.想數組中插入nil通常說明程序有錯,通過異痴可以更快的找個這個錯誤.

字面量字典

通常創(chuàng)建字典的做法:

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                        @"Country" ,@"firstName",
                                        @"Gene", @"lastName",
                                       @[NSNumber numberWitnInt:18], @"age", nil];

這樣寫令代碼的可讀性不高,因為順序是<對象>, <鍵>.這與通常的理解剛好相反.我們一般理解為"鍵"映射到"對象".然而使用字面量語法:

NSDictionary *dictionary = @{@"firstName" : @"Country", 
                           @"lastName" : @"Gene"
                            @"age" : @18};

這樣寫的好處一目了然.代碼可讀性還高.同時還指明:字典中的對象和建都必須是OC對象,所以不能把18直接放到字典中.

同樣用字面量語法創(chuàng)建字典也有一個問題,那就是一旦有值為nil,程序便會拋出異常.這樣也恰到好處提醒了程序猿們字典中有了空對象.同理"dictionaryWithObjectsAndKeys"則無法做到這一點.

還有一點就是通過鍵值來訪問其值,通常的做法:

NSString *name = [dictionary objectForKey:@"firstName"];

與之等效的字面量語法是:

NSString *name = dictionary[@"firstName"];
可變數組和字典

對于可變的數組和字典,字面量語法不僅能訪問到數組中某個下標對應的元素或字典中某個鍵對應的元素,還可以通過下標修改對應元素的值.
標準做法:

[mutableArray replaceObjectAtIndex:0 withObject:@"Ben"];
[mutableDictionary setObject:@"Ben" forKey:@"lastName"];

字面量語法:

mutableArray[0] = @"Ben"; 
mutableDictionary[@"lastName"] = @"Ben"; 
局限性

1.創(chuàng)建出來的對象必須屬于Foundation框架才行.如果自定義了這些類的子類,則無法使用字面量語法了.要想創(chuàng)建自定義子類的實例,必須采用"非字面量語法".不過也不建議這么做.因為NSArray, NSDictionary, NSNumber都是業(yè)已定型的"子族",很少有人會從其中自定義子類.真要這么做也比較麻煩.
2.字面量語法創(chuàng)建出來的字符串,數組,字典對象是不可變的.若想變成可變版本,需要復制一份.

NSMutableArray *mutableArray = [@[@1, @2, @3] mutableCopy];

這么做會多調用一個方法,而且還有再創(chuàng)建一個對象,不過筆者認為"功大于過"!

總結:
  • 應該使用字面量語法來創(chuàng)建字符串, 數組, 數值, 字典.與創(chuàng)建此類對象的常規(guī)方法相比這么做更簡潔明了.
  • 應該通過取下標操作來訪問數組下標或字典中鍵所對應的元素.
  • 用字面量語法創(chuàng)建數組或字典時,若值為nil, 則會拋出異常, 因此, 務必確保值里不包含nil.
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末馋贤,一起剝皮案震驚了整個濱河市赞别,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌配乓,老刑警劉巖仿滔,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異犹芹,居然都是意外死亡崎页,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門腰埂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來飒焦,“玉大人,你說我怎么就攤上這事屿笼∥” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵驴一,是天一觀的道長休雌。 經常有香客問我,道長肝断,這世上最難降的妖魔是什么杈曲? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮孝情,結果婚禮上鱼蝉,老公的妹妹穿的比我還像新娘洒嗤。我一直安慰自己箫荡,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布渔隶。 她就那樣靜靜地躺著羔挡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪间唉。 梳的紋絲不亂的頭發(fā)上绞灼,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音呈野,去河邊找鬼低矮。 笑死,一個胖子當著我的面吹牛被冒,可吹牛的內容都是我干的军掂。 我是一名探鬼主播轮蜕,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蝗锥!你這毒婦竟也來了跃洛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤终议,失蹤者是張志新(化名)和其女友劉穎汇竭,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體穴张,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡细燎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了皂甘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片找颓。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叮贩,靈堂內的尸體忽然破棺而出击狮,到底是詐尸還是另有隱情,我是刑警寧澤益老,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布彪蓬,位于F島的核電站,受9級特大地震影響捺萌,放射性物質發(fā)生泄漏档冬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一桃纯、第九天 我趴在偏房一處隱蔽的房頂上張望酷誓。 院中可真熱鬧,春花似錦态坦、人聲如沸盐数。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玫氢。三九已至,卻和暖如春谜诫,著一層夾襖步出監(jiān)牢的瞬間漾峡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工喻旷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留生逸,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像槽袄,于是被迫代替她去往敵國和親伟阔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容