Effective OC (1) 多用字面量語法,少用與之等價的方法

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

這么做雖然會多調用一個方法,而且多創建一個對象,不過使用字面量語法所帶來的好處還是多于上述缺點的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容