1. 程式人生 > >iOS9新特性,泛型

iOS9新特性,泛型

泛型:限制類型
開發中使用場景:     1.限制集合中的型別,只能檢測方法的呼叫,因為宣告的泛型只能存在方法中     2.當一個類在宣告的時候,某個物件的屬性不確定,只有建立物件的時候才能確定,就可以使用泛型。  定義泛型  書寫格式:放在型別的後面,表示限制這個型別   // 定義泛型:確定型別

@property (nonatomicstrongNSMutableArray<NSString *> *array;

這樣定義後表示array中只能存NSString的型別

我們呼叫self.array addObject的時候  Xcode提示我們傳入的型別為NSString 型別

我直接取到array中的第一個元素

self.array[0].length  可以直接呼叫NSString 的 length函式 說明預設做了一步型別轉換

宣告類中的泛型:

// 宣告泛型:不確定型別

@interface Person< ObjectType> : NSObject

@property (nonatomicstrong) 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

strong) ObjectType language;

@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 (nonatomicstrongNSString *name;

+ (__kindof Person *)person;

@end