天天看點

《編寫高品質代碼:改善Objective-C程式的61個建議》——建議4:優先使用對象字面量文法而非等效方法

本節書摘來自華章出版社《編寫高品質代碼:改善objective-c程式的61個建議》一 書中的第1章,第1.4節,作者:劉一道,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

很多剛從其他程式設計語言轉到objective-c的程式員,往往一看到長長的函數名就會感到崩潰,這種文法讓消息的傳遞像一個英語句子,雖有不足但确實大大增強了可讀性。比如想初始化一個浮點數,需要這麼寫:

從這句中能夠明确地知道代碼的含義,但是,是否連簡單的指派語句也要這麼處理呢?在2012年的蘋果年度大會上,蘋果介紹了大量objective-c的新特性之一—對象字面量(object literals),能夠幫助ios程式員更加高效地編寫代碼。在xcode 4.4版本中,這個新特性已經可以使用了。

對象字面量(object literals)允許友善地定義數字、數組和字典對象。這個功能類似于java 5提供的auto boxing功能。這雖然是一個文法改進,但是對提高寫代碼的效率幫助很大。蘋果在本次新特性中采用了折中的處理方式,針對很多基礎類型采用了簡寫的方式,實作文法簡化。簡化以後,會發現在文法層面這些簡化的objective-c更像python和ruby等動态語言的文法了。

下面先來看看以前定義數字、數組和字典對象的方法:

是不是很煩瑣?現在以上代碼可以簡化成以下形式,不用再在參數的最後加nil了,字典的key和value也不再是倒着先寫value,再寫key了:

下面逐一介紹。

數字(nsnumber)

簡化前的寫法:

簡化後的寫法:

裝箱表達式也可以采用類似的寫法:

可以分别簡寫為:

對于字元串表達式來說,需要注意的是,表達式的值一定不能是null,否則會抛出異常。

數組(nsarray)

對于nsarray的初始化來說,有非常多的寫法,這裡就不再一一羅列,直接看新的寫法:

非常簡單,再也不用記住初始化多個對象的數組時,後面還要跟一個nil。現在看一下當聲明多個對象的數組時,編譯器是如何處理的。

編譯器生成的代碼:

好吧,編譯器已經把這些簡單重複的工作都做了,現在可以安心解決真正的問題了。不過有一點要注意,如果a、b、c對象有nil的話,運作時系統會抛出異常,這點和原來的處理方式不同,編碼時要多加小心。

 數字(nsarray)和字典(nsdictionary)等類,由于能像“容器”一樣容納東西,是以,通常把這些具有容器特性的類稱為容器類。

字典(nsdictionary)

同樣,對于字典這個資料結構來說,有很多種初始化的方式,來看新的寫法:

下标法與容器類

容器的文法簡化讓人不難想到,可以通過下标的方式存取數組和字典的資料。比如對于數組:

可以這樣寫:

對于字典:

同時,自己定義的容器類隻要實作了規定的下标方法,就可以采用下标的方式通路資料。要實作的方法如下。

數組類型的下标方法:

字典類型的下标方法:

其中需要注意的是,indextype必須是整數,elementtype和keytype必須是對象指針。

容器類資料結構簡化的限制

采用上述寫法建構的容器都是不可變的,如果需要生成可變容器,可以傳遞-mutable copy消息。例如:

不能對常量數組直接指派,解決辦法是在類方法(void)initialize中進行指派處理,如下:

 要點

(1)盡量使用對象字面量文法來建立字元串、數字、數組和字典等,使用它比使用以前的正常對象建立方法文法更為精簡,同時可以避免一些常見的陷阱。

(2)對象字面量文法特性是完全向下相容,使用新特性編寫出來的代碼,經過編譯後形成的二進制程式可以運作在之前釋出的任何os中。

(3)在數字和字典中,要使用關鍵字和索引做下标來擷取資料。

(4)使用對象字面量文法時,容器類的不可是nil,否則運作時将會抛出異常。

繼續閱讀