Objective—C語言的新魅力
一、引言
在Xcode7中,iOS9的SDK已經全面相容了Objective-C的一些新特性和新功能。這些功能都隻作用于編譯期,對程式的運作并沒有影響,是以,它可以很好的向下進行相容,無縫的銜接低版本的iOS系統,那麼這些特性有什麼樣的用處呢,作為開發者,我保證你一定會愛上他們,如果你可以将這些新特性都應用于你的開發,你的開發效率和代碼品質,相比之前,會有一個很大的提升。
二、Nullability檢測的支援
在swift語言中,通過!和?可以将對象聲明成Optional,用于在開發中标記這個對象是否可以為空。在OC中,以前是沒有這樣的功能的,是以我們在開發中會經常遇到因為某個函數應該傳回執行個體而傳回了空導緻的崩潰。Nullability的主要用武之地,就是在這裡,它可以起到提示開發者做是否為空得判斷的提示。
打開Xcode7,系統的架構中已經支援了Nullability,如下:
@property (nullable, nonatomic, readonly) ObjectType firstObject;
@property (nullable, nonatomic, readonly) ObjectType lastObject;
這是NSArray中的兩個屬性,其中nullable關鍵字說明了這裡可能傳回空的值。
如果僅僅是在傳回值中給開發者一些提示,你可能覺得應用并不大,是的,對開發者最大的幫助是這一特性可以用于函數的參數中,這樣我們在調用函數時起到的提示作用,将是非常重要的,越是多人合作的項目,作用也越大。
例如:
-(void)setValue:(NSNumber * _Nonnull )number{
}
我們在調用函數時,如果傳入了空值,編譯器會給我們警告:
注意:
這一特性在Xcode6.3中就已經支援,但在Xcode7中又做了一些寫法上的小改動,例如,在Xcode6.3中這樣寫:
-(void)setValue:( nonnull NSNumber * )number{
而在Xcode7中提倡我們使用第一種寫法。
與之相關的幾個關鍵字如下:
修飾參數
nonnull:不可為空
nullable: 可以為空
null_unspecified:不确定是否可以為空(極少情況)
在屬性的聲明中,還會有如下一個修飾符:
null_resettable:set方法可以為nil,get方法不可傳回nil
一點提示:
你可以發現,iOS9的SDK中已經完全相容使用了這些特性,并且nonnull的使用會比nullable廣泛的多,是以,系統提供了這樣一對宏:
#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
#define NS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end")
我們在這對宏之間定義的變量都會加上nonnull的修飾符,隻有我們特殊聲明nullable的才需要手動寫。
三、泛型集合的支援
這一特性和Nullability一樣,隻作用于編譯期,是為我們開發者服務的另一重要特性。還記得,在Xcode7之前,依然是為了友善多人開發,我經常會在架構中寫這樣的一個空得宏:
在開發時如下使用,做到提示夥伴我這個數組中是什麼東西的作用:
@interface ViewController ()
{
NSArray __TYPE__FIT_TO__CLASS(NSString) * array;
@end
當然,所有這些都是我自己的自導自演,編譯器并不會鳥我,我在這個數組中加其他的東西,它也不會介意,所有這些隻是我和我的夥伴們約定的一種一廂情願。是以,當我看到Xcode7中的集合類型時,我着實興奮了一下。
1、有類型約定的集合
在Xcode7中,我們可以給集合類型添加一個泛型的約定,如下:
NSMutableArray<NSString *> *array = [[NSMutableArray alloc]init];
聲明了這樣一個數組後,就好比我告訴了編譯器,這個數組中的資料類型都是NSString*類型的,現在非常好,如果我這個數組中元素的方法,會出現如下的提示:
激動吧,使用點文法可以通路到數組中泛型的方法了,還有更加誘人的:
在我們向這個數組中追加元素的時候,編譯器将元素的類型提示了出來,并且将FromArray方法中需要的元素類型也提示了出來。
同樣,如果我們向這個數組中追加類型不比對的元素,如下:
NSMutableArray<NSString *> *array = [[NSMutableArray alloc]init];
[array addObject:@1];
編譯器會給我們一個這樣的警告: