編寫Objective-C程序時,總會用到某幾個類,它們屬於Foundation框架。雖然從技術上來講,不用Foundation框架也能寫出Objective-C代碼,但實際上卻常常要用到此框架。這幾個類是NSString、NSNumber、NSArray、NSDictionary。從類名上便可看出各自所表示的數據結構。
數組
Objective-C以語法繁雜而著稱。事實上的確是這樣。不過,從Objective-C 1.0起,有一種很是簡單的方式能建立NSString對象。這就是「字符串字面量」(string literal),其語法以下:
NSString *someString = @」Effective Objective-C 2.0」; 安全
若是不用這種語法的話,就要以常見的alloc及init方法來分配並初始化NSString對象了。在版本較新的編譯器中,也能用這種字面量語法來聲明NSNumber、NSArray、NSDictionary類的實例。使用字面量語法(literal syntax)能夠縮減源代碼長度,使其更爲易讀。 數據結構
字面數值 app
有時須要把整數、浮點數、布爾值封入Objective-C對象中。這種狀況下能夠用NSNumber類,該類可處理多種類型的數值。如果不用字面量,那麼就須要按下述方式建立實例:
NSNumber *someNumber = [NSNumber numberWithInt:1]; 框架
上面這行代碼建立了一個數字,將其值設爲整數1。然而使用字面量能令代碼更爲整潔:
NSNumber *someNumber = @1; spa
你們能夠看到,字面量語法更爲精簡。不過它還有不少好處。可以以NSNumber實例表示的全部數據類型均可使用該語法。例如:
NSNumber intNumber = @1;
NSNumber floatNumber = @2.5f;
NSNumber doubleNumber = @3.14159;
NSNumber boolNumber = @YES;
NSNumber *charNumber = @’a’; 3d
字面量語法也適用於下述表達式:
對象
以字面量來表示數值十分有用。這樣作能夠令NSNumber對象變得整潔,由於聲明中只包含數值,而沒有多餘的語法成分。blog
字面量數組ip
數組是經常使用的數據結構。若是不使用字面量語法,那麼就要這樣來建立數組:
而使用字面量語法來建立則是:
上面這種作法不只簡單,並且還利於操做數組。數組的常見操做就是取某個下標所對應的對象,這用字面量來作更爲容易。若是不用字面量,那麼一般會用「objectAtIndex:」方法:
若使用字面量,則是:
這也叫作「取下標」操做(subscripting),與使用字面量語法的其餘狀況同樣,這種方式也更爲簡潔、更易理解,並且與其餘語言中依下標來訪問數組元素時所用的語法相似。
不過,用字面量語法建立數組時要注意,若數組元素對象中有nil,則會拋出異常,由於字面量語法實際上只是一種「語法糖」(syntactic sugar),其效果等因而先建立了一個數組,而後把方括號內的全部對象都加到這個數組中。拋出的異常會是這樣:
1 |
*** Terminating app due to uncaught exception |
在改用字面量語法來建立數組時就會遇到這個問題。下面這段代碼分別以兩種語法建立數組:
1 |
id object1 = /* ... */; |
你們想一想:若是object1與object3都指向了有效的Objective-C對象,而object2是nil,那麼會出現什麼狀況呢?按字面量語法建立數組arrayB時會拋出異常。arrayA雖然能建立出來,可是其中卻只含有object1一個對象。緣由在於,「arrayWithObjects:」方法會依次處理各個參數,直到發現nil爲止,因爲object2是nil,因此該方法會提早結束。
這個微妙的差異代表,使用字面量語法更爲安全。拋出異常令應用程序終止執行,這比建立好數組以後才發現元素個數少了要好。向數組中插入nil一般說明程序有錯,而經過異常能夠更快地發現這個錯誤。
字面量字典
「字典」(Dictionary)是一種映射型數據結構,可向其中添加鍵值對。與數組同樣,Objective-C代碼也常常用到字典。其建立方式以下:
這樣寫使人困惑,由於其順序是<對象>,<鍵>,<對象>,<鍵>。這與一般理解的順序相反,咱們通常認爲是把「鍵」映射到「對象」。所以,這種寫法不容易讀懂。若是改用字面量語法,就清晰多了:
上面這種寫法更簡明,並且鍵出如今對象以前,理解起來較順暢。此範例代碼還說明了使用字面量數值的好處。字典中的對象和鍵必須都是Objective-C對象,因此不能把整數28直接放進去,而要將其封裝在NSNumber實例中才行。使用字面量語法很容易就能作到這一點,只需給數字前加一個@字符便可。
與數組同樣,用字面量語法建立字典時也有個問題,那就是一旦有值爲nil,便會拋出異常。不過基於一樣的緣由,這也是個好事。假如在建立字典時不當心用了空值對象,那麼「dictionaryWithObjectsAndKeys:」方法就會在首個nil以前停下,並拋出異常,這有助於查錯。
字典也能夠像數組那樣用字面量語法訪問。按照特定鍵訪問其值的傳統作法是:
與之等效的字面量語法則是:
這樣寫也省去了冗贅的語法,令此行代碼簡單易讀。
可變數組與字典
經過取下標操做,能夠訪問數組中某個下標或字典中某個鍵所對應的元素。若是數組與字典對象是可變的(mutable),那麼也能經過下標修改其中的元素值。修改可變數組與字典內容的標準作法是:
若換用取下標操做來寫,則是:
侷限性
字面量語法有個小小的限制,就是除了字符串之外,所建立出來的對象必須屬於Foundation框架才行。若是自定義了這些類的子類,則沒法用字面量語法建立其對象。要想建立自定義子類的實例,必須採用「非字面量語法」(nonliteral syntax)。然而,因爲NSArray、NSDictionary、NSNumber都是業已定型的「子族」(class cluster,參見第9條),所以不多有人會從其中自定義子類,真要那樣作也比較麻煩。並且通常來講,標準的實現已經很好了,無須再改動。建立字符串時可使用自定義的子類,然而必需要修改編譯器的選項才行。除非你明白這樣作的後果,不然不鼓勵使用此選項,用NSString就足夠了。
使用字面量語法建立出來的字符串、數組、字典對象都是不可變的(immutable)。若想要可變版本的對象,則需複製一份:
這麼作會多調用一個方法,並且還要再建立一個對象,不過使用字面量語法所帶來的好處仍是多於上述缺點的。
要點
應該使用字面量語法來建立字符串、數值、數組、字典。與建立此類對象的常規方法相比,這麼作更加簡明扼要。
應該經過取下標操做來訪問數組下標或字典中的鍵所對應的元素。