iOS開發(fā)基礎(chǔ):讓編碼效率提高200%的方法-字面量大全


身為一個(gè)Coder垄琐,自己已擁有的工具蹦肴,需要挖掘它們的潛力赶袄,本篇來系統(tǒng)梳理下字面量這個(gè)容易被忽略的OC語法工具揽涮。

字面量這個(gè)詞似乎挺陌生,但是下面的代碼你一定用過:

NSLog(@"Hello world");

這里@包含的就是一個(gè)字符串的字面量饿肺,如果不用字面量蒋困,你就需要這樣寫:

NSString *str = [[NSString alloc] initWithCString:"Hello world" encoding:NSUTF8StringEncoding];
NSLog(@"%@", str);

繁瑣不說,還很不直觀敬辣。有些教程稱字面量為語法糖雪标,倒是十分寫意,確實(shí)

字面量是LLVM4提供的一種簡便語法,可直接使用來聲明一些OC對(duì)象


字符串的意外發(fā)現(xiàn)

偶然的一次失誤溉跃,發(fā)現(xiàn)以下代碼可以編譯運(yùn)行:

NSString *strThree = @"one,two,"@"three";
NSLog(@"%@", @"one,two,""three");
NSLog(@"%@", @"one,two,"@"three");
NSLog(@"%@", strThree);

結(jié)果輸出了:
one,two,three
實(shí)際上以上代碼實(shí)現(xiàn)了字符串的拼接村刨,在特定場合對(duì)代碼可讀性有特殊作用,比如SQL語句:

[db executeUpdate:
                @"CREATE TABLE Person ("
                @"    id           INTEGER PRIMARY KEY,"
                @"    name         TEXT NOT NULL DEFAULT '',"
                @"    colorName    TEXT NOT NULL,"
                @"    taps         INTEGER NOT NULL DEFAULT 0,"
                @"    createdTime  INTEGER NOT NULL,"
                @"    modifiedTime INTEGER NOT NULL"
                @");"
            ]

這樣使代碼清晰可讀撰茎!


創(chuàng)建NSNumber

NSNumber *myNumber = @3; 
NSNumber *yesValue = @YES;

注意: 不能把 @3 寫成 @"3" 嵌牺,會(huì)將數(shù)字轉(zhuǎn)換為NSString,造成不可預(yù)估的類型錯(cuò)誤。
默認(rèn)情況下髓梅,數(shù)字值被當(dāng)做有符號(hào)整型拟蜻,小數(shù)值被當(dāng)做double類型。通過加后綴的方式枯饿,轉(zhuǎn)換為float型:

NSNumber *valueOfPi = @3.14F; //使用float字面量聲明一個(gè)NSNumber對(duì)象 
NSNumber *radius = @3U; //使用無符號(hào)integer字面量聲明一個(gè)NSNumber對(duì)象

類型后綴如下表所示:

后綴 類型
F float
U unsigned int
L long
LL long long

使用表達(dá)式

NSNumber *sum = @(1+2);

創(chuàng)建NSArray

NSString *str1 = @"Hello";
NSString *str2 = @"World";
NSString *str3 = @"!";

NSArray *myArray1 = [NSArray arrayWithObjects:str1, str2, str3, nil];//用舊方法創(chuàng)建一個(gè)新數(shù)組 
NSArray *myArray2 = @[str1, str2, str3]; //使用集合字面量創(chuàng)建一個(gè)新數(shù)組

結(jié)合字符串和NSNumber字面量聲明數(shù)組:

NSArray *strArray = @[@"Hello", @"World", @"!"]; 
NSArray *numArray = @[@1, @2, @3]; 

創(chuàng)建“二維”數(shù)組

OC中的二維數(shù)組實(shí)際上是嵌套的數(shù)組酝锅,利用的是數(shù)組能夠存儲(chǔ)對(duì)象,而數(shù)組本身也是一種對(duì)象這一事實(shí)奢方。

NSArray *numArray2d = @[@[@1, @2, @3],
                        @[@11, @12, @13],
                        @[@21, @22, @23]
                       ]; 

使用二維數(shù)組搔扁,強(qiáng)烈推薦,你可以自己嘗試用 objectAtIndex 寫一下相同的訪問作對(duì)比

numArray2d[2][2]

創(chuàng)建NSDictionary

NSDictionary *dictionary2 = @{@"KEY1":@"value1",
                              @"KEY2":@"value2",
                              @"KEY3":@"value3"};

嵌套的字典聲明蟋字,字面量占盡優(yōu)勢(shì):

NSDictionary *dictionary = @{@"KEY1":@{@"KEY11":@"value11",
                                       @"KEY12":@"value12",
                                       @"KEY13":@"value13"},
                             @"KEY2":@"value2",
                             @"KEY3":@"value3"};

而“過時(shí)”的聲明方法來實(shí)現(xiàn)一個(gè)嵌套的字典稿蹲,實(shí)在過于繁瑣,我再也不想那樣寫了鹊奖。


下標(biāo)訪問

現(xiàn)在你已經(jīng)知道如何方便地聲明數(shù)組和字典苛聘,而字面量將賦予NSArray與傳統(tǒng)C語言數(shù)組一樣的元素訪問能力,感覺釋放了NSArray的小宇宙:

NSArray *array = @[@1, @2, @3, @4, @5]; 
int elementAt3 = array[3];

對(duì)比無字面量的方法:

NSArray *array = [NSArray arrayWithObjects:[NSNumber numberWithInt:1], [NSNumber numberWithInt:2], [NSNumber numberWithInt:3], nil];
int elementAt3 = [array objectAtIndex:3];

節(jié)省的時(shí)間和代碼量堪稱幾何級(jí)忠聚!
而對(duì)于字典(NSDictionary)设哗,提供字符串形式的下標(biāo)訪問:

NSDictionary *dictionary = @{@"KEY1":@"value1",
                             @"KEY2":@"value2",
                             @"KEY3":@"value3"};
NSString strAtKey3 = dictionary[@"KEY3"];

重要提示:以上字面量聲明中用到,都不能為nil两蟀,需要用[NSNull null]代替网梢;
另外,如果對(duì)象中有成員為nil赂毯,會(huì)立刻拋出異常战虏,而數(shù)組的構(gòu)造方法會(huì)聲明一個(gè)異常長度的數(shù)組對(duì)象(arrayWithObjects遇到nil后,會(huì)將nil前的對(duì)象聲明為成員党涕,nil后的對(duì)象則被丟棄7掣小),后者往往更難排查膛堤。所以字面量聲明數(shù)組啸盏,也是排坑的不二之選。如:

NSString *str1 = @"one";
NSString *str2;
NSString *str3 = @"three";
NSArray *array = @[str1, str2, str3];

假設(shè)str2==nil,會(huì)報(bào)異常:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ' -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[1]'

也由拋出的異称锼睿可見回懦,字面量運(yùn)行時(shí)實(shí)際轉(zhuǎn)換成了

NSString *cArray[3] = {str1, str2, str3}; //純C數(shù)組的初始化
NSArray *array = [NSArray arrayWithObjects:cArray count:3];

創(chuàng)建可變集合對(duì)象

字面量創(chuàng)建默認(rèn)為不可變集合對(duì)象,需要可變集合對(duì)象調(diào)用mutableCopy即可:

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

字典聲明類似次企。

轉(zhuǎn)為可變集合后怯晕,也開啟了下標(biāo)操作的“新技能”——寫操作

mutableArray[3] = @"NewValue";
mutableDictionary[@"KEY3"] = @"NewValue";
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缸棵,隨后出現(xiàn)的幾起案子舟茶,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吧凉,死亡現(xiàn)場離奇詭異隧出,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)阀捅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門胀瞪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饲鄙,你說我怎么就攤上這事凄诞。” “怎么了忍级?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵帆谍,是天一觀的道長。 經(jīng)常有香客問我轴咱,道長汛蝙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任朴肺,我火速辦了婚禮窖剑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宇挫。我一直安慰自己,他們只是感情好酪术,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布器瘪。 她就那樣靜靜地躺著,像睡著了一般绘雁。 火紅的嫁衣襯著肌膚如雪橡疼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天庐舟,我揣著相機(jī)與錄音欣除,去河邊找鬼。 笑死挪略,一個(gè)胖子當(dāng)著我的面吹牛历帚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杠娱,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼挽牢,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了摊求?” 一聲冷哼從身側(cè)響起禽拔,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后睹栖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硫惕,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年野来,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恼除。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梁只,死狀恐怖缚柳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搪锣,我是刑警寧澤秋忙,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站构舟,受9級(jí)特大地震影響灰追,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狗超,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一弹澎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧努咐,春花似錦苦蒿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至竿屹,卻和暖如春报强,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拱燃。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工秉溉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碗誉。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓召嘶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哮缺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苍蔬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容