Objective-C 以語法繁雜而著稱。事實上的確是這樣癞谒。不過底燎,從Objective-C 1.0起,有一種非常簡單的方法能創(chuàng)建NSString對象弹砚。這就是“字符串字面量”(string literal)双仍,其語法如下:
NSString *something = @"Effective objective c ";
如果不用這種語法的話,就要以常見的alloc及init方法來分配初始化NSString對象了桌吃。在后續(xù)的迭代的編譯器版本中朱沃,也能用這種字面量語法來聲明NSNumber、NSArray茅诱、NSDictionary類的實例为流。使用字面量語法可以縮減代碼長度,使其更為易讀让簿。
字面數值
? ? 一般需要把整數敬察、浮點數、布爾值封入OC對象中尔当,需要使用NSNumber類莲祸,需要如下創(chuàng)建實例:
NSNumber *someNumber = [NSNumber numberWithInt:1];
也可以用字面量語法
NSNumber *someNumber = @1;
易見蹂安,字面量語法更加簡潔。不過他還有很多好處锐帜。能夠以NSNumber實例表示所有數據類型田盈。
NSNumber *intNumber = @1;
NSNumber *floatNumber = @2.5f;
NSNumber *doubleNumber = @3.1415926;
NSNumber *boolNumber = @YES;
NSNumber *charNumber = @'a';
這樣做可以令NSNumber對象變得簡潔,因為聲明中只包含數值缴阎,而沒有多余的語法成分允瞧。
字面量數組
數組是常用的數據結構,如果不用字面量語法蛮拔,那么就要這樣創(chuàng)建數組:
NSArray *animals = [NSArray arrayWithObjects:@"cat",@"dog",@"mouse",@"badger",nil];
而用字面量語法創(chuàng)建則是:
NSArray *animals = @[@"cat",@"dog",@"mouse",@"badger",nil];
上面這種語法不僅簡單述暂,而且有利于操作數組。操作數組最常見的操作就是取某個下標所對應的對象建炫,這用字面量語法也更容易畦韭。如果不用字面量語法,通常會用“objectAtIndex:”方法:
NSString *dog = [animals objectAtIndex:1];
若使用字面量語法:
NSString * dog = animals[1];
這也叫做“取下標”操作(subscripting),與使用字面量語法一樣肛跌,這種方法更為簡潔艺配、更易理解。
我們來看下這個例子:
NSArray *arrayA = [NSArray arrayWithObject:Object1,Object2,Object3];
NSArray *arrayB = @[@"Object1",@"Object2",@"Object3"];
大家想想:如果Object1衍慎,Object3都指向了有效的Objective-C對象转唉,而Object2是nil,那么會出現什么情況呢稳捆?
按字面量語法創(chuàng)建數組arrayB會拋出異常赠法。arrayA雖然能創(chuàng)建出來,但是只有一個Object1對象眷柔。原因在于“arrayWithObject”方法會依次處理各個參數期虾,直到發(fā)現nil為止原朝,由于Object2為nil驯嘱,所以該方法會提前結束。
這個微妙差別表明喳坠,使用字面量語法更為安全鞠评。
字面量字典
字典是一種映射的數據結構,在Objective-C中創(chuàng)建方式如下壕鹉,
NSDictionary *personData = [NSDictionary dictionaryWithObjectAndKeys:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@"Matt",@"firstName",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@"Gall",@"lastName",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@"[NSNumber numberWithInt:28]",@"age"];
這樣寫令人困惑剃幌,因為其順序是<對象>,<鍵>,<對象>,<鍵>。這與通常理解的順序相反晾浴。如果改成字面量語法负乡,就明顯易懂多了。
NSDictionary *personData = @{@"firstName":@"Matt",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @"lastName":@"Gall",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @"age":@28};
上面這種寫法更簡明脊凰,而且鍵出現在對象前面抖棘,理解起來更為順暢。此范例還說明額字面量數值的好處,字典對象和鍵都必須是對象切省,所以整數28不能直接放入最岗,必須封裝成NSNumber才行,而字面量語法很容易做到這一點只需加一個@即可朝捆。
與數組一樣般渡,用字面量語法創(chuàng)建字典時也有一個問題,那就是遇到nil就會拋出異常芙盘,不過這也是個好事驯用。幫助我們在編寫代碼時及時發(fā)現問題,而不用等編譯好才發(fā)現何陆。
可變數組與字典
通過取下標操作晨汹,可以訪問數組某個下標或字典中某個鍵值對對應的對象。如果數組或字典是可變的(mutable)贷盲,那么也能通過下標修改其中元素值淘这。
mutableArray[1] = @"dog";
mutableDictionary[@"lastName"] = @"Gall";
局限性
1)字面量語法有個小小的限制,就是除了字符串以外巩剖,所創(chuàng)建出來的對象必須屬于Foundation框架铝穷。
2)是用字面量語法創(chuàng)建出來的字符串、數組佳魔、字典對象都是不可變的(immutable)曙聂。若想要變成可變的需要復制一份:
NSMutableArray *mutable = [@[@1,@2,@3,@4,@5]mutableCopy];
這么做雖然會多調用一個方法,而且多創(chuàng)建一個對象鞠鲜,不過使用字面量語法所帶來的好處還是多于上述缺點的宁脊。