iOS9新特性,泛型
開發中使用場景: 1.限制集合中的型別,只能檢測方法的呼叫,因為宣告的泛型只能存在方法中 2.當一個類在宣告的時候,某個物件的屬性不確定,只有建立物件的時候才能確定,就可以使用泛型。 定義泛型 書寫格式:放在型別的後面,表示限制這個型別 // 定義泛型:確定型別
@property (nonatomic, strong) NSMutableArray<NSString *> *array;
這樣定義後表示array中只能存NSString的型別
我們呼叫self.array addObject的時候 Xcode提示我們傳入的型別為NSString 型別
self.array[0].length 可以直接呼叫NSString 的 length函式 說明預設做了一步型別轉換
宣告類中的泛型:
// 宣告泛型:不確定型別
@interface Person< ObjectType> : NSObject
@property (nonatomic, strong) ObjectType car;
@end
在建立物件的時候可以直接傳入型別:
Person<Car *> *p = [[Person alloc]init]; 物件p裡面的car變數的型別就是Car型別了
泛型的好處:
提高程式設計師的開發規範,減少交流成本
從陣列和字典中取出的值都是id型別,不能呼叫點語法,使用了泛型就可以呼叫點語法
預設帶有泛型的變數相互賦值會有警告,使用協變和逆變可以解決警告的問題
__covariant 協變 向上轉型,子類轉父類
__contravariant 逆變 向下轉型,父類轉子類
SedanCar 的父類是Car類
// 宣告泛型:宣告時候使用了__covariant關鍵字
@interface Person<__covariant ObjectType> : NSObject
@property (nonatomic
@end
那麼 Person<Car *> *p1 = [[Person alloc]init];
Person<SedanCar *> *p2 = [[Person alloc]init];
p1 = p2;
p2賦值給p1就不會有警告
如果使用了__contravariant關鍵字 將p1賦值給p2就不會產生警告
__kindof:相當於,表示某個類或者他的子類
設計模型中可以使用,當給某個類提供類方法,想讓外界呼叫能看到建立什麼物件,並且不報警告。
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
+ (__kindof Person *)person;
@end