Objective-C 以語法繁雜而著稱。事實上的確是這樣。不過,從Objective-C 1.0起,有一種非常簡單的方法能創建NSString對象。這就是“字符串字面量”(string literal),其語法如下:
NSString *something = @"Effective objective c ";
如果不用這種語法的話,就要以常見的alloc及init方法來分配初始化NSString對象了。在后續的迭代的編譯器版本中,也能用這種字面量語法來聲明NSNumber、NSArray、NSDictionary類的實例。使用字面量語法可以縮減代碼長度,使其更為易讀。
字面數值
? ? 一般需要把整數、浮點數、布爾值封入OC對象中,需要使用NSNumber類,需要如下創建實例:
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對象變得簡潔,因為聲明中只包含數值,而沒有多余的語法成分。
字面量數組
數組是常用的數據結構,如果不用字面量語法,那么就要這樣創建數組:
NSArray *animals = [NSArray arrayWithObjects:@"cat",@"dog",@"mouse",@"badger",nil];
而用字面量語法創建則是:
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,那么會出現什么情況呢?
按字面量語法創建數組arrayB會拋出異常。arrayA雖然能創建出來,但是只有一個Object1對象。原因在于“arrayWithObject”方法會依次處理各個參數,直到發現nil為止,由于Object2為nil,所以該方法會提前結束。
這個微妙差別表明,使用字面量語法更為安全。
字面量字典
字典是一種映射的數據結構,在Objective-C中創建方式如下,
NSDictionary *personData = [NSDictionary dictionaryWithObjectAndKeys:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@"Matt",@"firstName",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@"Gall",@"lastName",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@"[NSNumber numberWithInt:28]",@"age"];
這樣寫令人困惑,因為其順序是<對象>,<鍵>,<對象>,<鍵>。這與通常理解的順序相反。如果改成字面量語法,就明顯易懂多了。
NSDictionary *personData = @{@"firstName":@"Matt",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @"lastName":@"Gall",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @"age":@28};
上面這種寫法更簡明,而且鍵出現在對象前面,理解起來更為順暢。此范例還說明額字面量數值的好處,字典對象和鍵都必須是對象,所以整數28不能直接放入,必須封裝成NSNumber才行,而字面量語法很容易做到這一點只需加一個@即可。
與數組一樣,用字面量語法創建字典時也有一個問題,那就是遇到nil就會拋出異常,不過這也是個好事。幫助我們在編寫代碼時及時發現問題,而不用等編譯好才發現。
可變數組與字典
通過取下標操作,可以訪問數組某個下標或字典中某個鍵值對對應的對象。如果數組或字典是可變的(mutable),那么也能通過下標修改其中元素值。
mutableArray[1] = @"dog";
mutableDictionary[@"lastName"] = @"Gall";
局限性
1)字面量語法有個小小的限制,就是除了字符串以外,所創建出來的對象必須屬于Foundation框架。
2)是用字面量語法創建出來的字符串、數組、字典對象都是不可變的(immutable)。若想要變成可變的需要復制一份:
NSMutableArray *mutable = [@[@1,@2,@3,@4,@5]mutableCopy];
這么做雖然會多調用一個方法,而且多創建一個對象,不過使用字面量語法所帶來的好處還是多于上述缺點的。