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

Objective-C以復雜的語法著稱,事實上確實是這樣.不過從Objective-C1.0開始,有一個非常簡單的方式創(chuàng)建NSString對象,那就是"字符串字面量",其語法如下:

NSString *str = @"Objective-C is the best programming language";

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

字面數(shù)值

整數(shù), 浮點數(shù), 布爾值封入Objective-C對象中.這種情況下,可以使用NSNumber類.
一般做法:

NSNumber *num = [NSNumber numberWithInt:3];

字面量語法:

NSNumber *num = @1;

可以看到,字面量語法更為簡潔.不過它的好處還遠不止這些,能以NSNumber實例表示的所有數(shù)據(jù)類型都可以使用該語法,例如:

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);

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

字面量數(shù)組

數(shù)組是常用的數(shù)據(jù)結構,通常創(chuàng)建一個數(shù)組的方法是:

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

而使用字面量語法來創(chuàng)建則是:

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

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

NSString *string = [array objectAtIndex:0];

適用字面量語法的做法則是:

NSString *string = array[0];

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

注意:

使用字面量語法創(chuàng)建數(shù)組時,若數(shù)組元素對象中有nil,則會拋出異常.因為字面量語法其實是一種"語法糖"(計算機語言中與另外一套語法等效但是開發(fā)者使用起來更加方便的語法,語法糖可以使程序的可讀性提高,同時減少代碼出錯率).其效果等于先創(chuàng)建了一個數(shù)組,然后把方括號中的所有對象都加到這個數(shù)組中.

舉個例子:
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:方法會依次處理每個參數(shù),直到發(fā)現(xiàn)nil為止.

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

字面量字典

"字典"是一種映射型數(shù)據(jù)結構,可向其中添加鍵值對.OC中通常創(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"];
可變數(shù)組和字典

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

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

字面量語法:

mutableArray[0] = @"Ben";
mutableDictionary[@"lastName"] = @"Ben";

好處不言自明!

局限性

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

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

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

總結:
  • 應該使用字面量語法來創(chuàng)建字符串, 數(shù)組, 數(shù)值, 字典.與創(chuàng)建此類對象的常規(guī)方法相比這么做更簡潔明了.
  • 應該通過取下標操作來訪問數(shù)組下標或字典中鍵所對應的元素.
  • 用字面量語法創(chuàng)建數(shù)組或字典時,若值為nil, 則會拋出異常, 因此, 務必確保值里不包含nil.
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纫塌,更是在濱河造成了極大的恐慌诊县,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件措左,死亡現(xiàn)場離奇詭異依痊,居然都是意外死亡,警方通過查閱死者的電腦和手機怎披,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門胸嘁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凉逛,你說我怎么就攤上這事性宏。” “怎么了状飞?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵毫胜,是天一觀的道長。 經常有香客問我诬辈,道長酵使,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任焙糟,我火速辦了婚禮口渔,結果婚禮上,老公的妹妹穿的比我還像新娘穿撮。我一直安慰自己缺脉,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布悦穿。 她就那樣靜靜地躺著枪向,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咧党。 梳的紋絲不亂的頭發(fā)上秘蛔,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音傍衡,去河邊找鬼深员。 笑死,一個胖子當著我的面吹牛蛙埂,可吹牛的內容都是我干的倦畅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼绣的,長吁一口氣:“原來是場噩夢啊……” “哼叠赐!你這毒婦竟也來了欲账?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤芭概,失蹤者是張志新(化名)和其女友劉穎赛不,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罢洲,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡踢故,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惹苗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殿较。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖桩蓉,靈堂內的尸體忽然破棺而出淋纲,到底是詐尸還是另有隱情,我是刑警寧澤院究,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布洽瞬,位于F島的核電站,受9級特大地震影響儡首,放射性物質發(fā)生泄漏片任。R本人自食惡果不足惜偏友,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一蔬胯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧位他,春花似錦氛濒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至窿冯,卻和暖如春骗奖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背醒串。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工执桌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芜赌。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓仰挣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缠沈。 傳聞我的和親對象是個殘疾皇子膘壶,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容