第3條:多用字面量語法,少用與之等價的方法

第3條:多用字面量語法,少用與之等價的方法(1)express

編寫Objective-C程序時,總會用到某幾個類,它們屬於Foundation框架。雖然從技術上來講,不用Foundation框架也能寫出Objective-C代碼,但實際上卻常常要用到此框架。這幾個類是NSString、NSNumber、NSArray、NSDictionary。從類名上便可看出各自所表示的數據結構。數組

Objective-C以語法繁雜而著稱。事實上的確是這樣。不過,從Objective-C 1.0起,有一種很是簡單的方式能建立NSString對象。這就是「字符串字面量」(string literal),其語法以下:
 數據結構

 
 
 
 
 
  1. NSString *someString = @"Effective Objective-C 2.0"; app

若是不用這種語法的話,就要以常見的alloc及init方法來分配並初始化NSString對象了。在版本較新的編譯器中,也能用這種字面量語法來聲明NSNumber、NSArray、NSDictionary類的實例。使用字面量語法(literal syntax)能夠縮減源代碼長度,使其更爲易讀。框架

字面數值spa

有時須要把整數、浮點數、布爾值封入Objective-C對象中。這種狀況下能夠用NSNumber類,該類可處理多種類型的數值。如果不用字面量,那麼就須要按下述方式建立實例:
 對象

 
 
 
 
 
  1. NSNumber *someNumber = [NSNumber numberWithInt:1]; ip

上面這行代碼建立了一個數字,將其值設爲整數1。然而使用字面量能令代碼更爲整潔:
 字符串

 
 
 
 
 
  1. NSNumber *someNumber = @1; 編譯器

你們能夠看到,字面量語法更爲精簡。不過它還有不少好處。可以以NSNumber實例表示的全部數據類型均可使用該語法。例如:
 

 
 
 
 
 
  1. NSNumber *intNumber = @1;  

  2. NSNumber *floatNumber = @2.5f;  

  3. NSNumber *doubleNumber = @3.14159;  

  4. NSNumber *boolNumber = @YES;  

  5. NSNumber *charNumber = @'a'; 

字面量語法也適用於下述表達式:
 

 
 
 
 
 
  1. int x = 5;  

  2. float y = 6.32f;  

  3. NSNumber *expressionNumber = @(x * y); 

以字面量來表示數值十分有用。這樣作能夠令NSNumber對象變得整潔,由於聲明中只包含數值,而沒有多餘的語法成分。

字面量數組

數組是經常使用的數據結構。若是不使用字面量語法,那麼就要這樣來建立數組:
 

 
 
 
 
 
  1. NSArray *animals =  

  2.     [NSArray arrayWithObjects:@"cat", @"dog",  

  3.                              @"mouse", @"badger", nil]; 

而使用字面量語法來建立則是:
 

 
 
 
 
 
  1. NSArray *animals = @[@"cat", @"dog", @"mouse", @"badger"]; 

上面這種作法不只簡單,並且還利於操做數組。數組的常見操做就是取某個下標所對應的對象,這用字面量來作更爲容易。若是不用字面量,那麼一般會用「objectAtIndex:」方法:
 

 
 
 
 
 
  1. NSString *dog = [animals objectAtIndex:1]; 

若使用字面量,則是:
 

 
 
 
 
 
  1. NSString *dog = animals[1]; 

這也叫作「取下標」操做(subscripting),與使用字面量語法的其餘狀況同樣,這種方式也更爲簡潔、更易理解,並且與其餘語言中依下標來訪問數組元素時所用的語法相似。

不過,用字面量語法建立數組時要注意,若數組元素對象中有nil,則會拋出異常,由於字面量語法實際上只是一種「語法糖」(syntactic sugar),其效果等因而先建立了一個數組,而後把方括號內的全部對象都加到這個數組中。拋出的異常會是這樣:
 

 
 
 
 
 
  1. *** Terminating app due to uncaught exception  

  2. 'NSInvalidArgumentException', reason: '***  

  3. -[__NSPlaceholderArray initWithObjects:count:]: attempt to  

  4. insert nil object from objects[0]' 

相關文章
相關標籤/搜索