iOS-關鍵字-泛型ObjectType 協變__covariant 逆變__contravariant

imkata發表於2018-03-05

一.泛型作用

    泛型:限制型別 

    為什麼要推出泛型?迎合swift

 

    泛型作用:1.限制型別 2.提高程式碼規劃,減少溝通成本,一看就知道集合中是什麼東西

二.泛型用法:

    __covariant:協變, 子類轉父類

    __contravariant:逆變 父類轉子類

1.泛型宣告:在宣告類的時候,在類的後面<泛型名稱>

 //第一步 宣告泛型

 @interface Person<__covariant ObjectType> : NSObject

 

 // 語言

 @property (nonatomic, strong) ObjectType language;


2.使用泛型 型別<限制型別>

 // iOS

 Person<iOS *> *p = [[Person alloc] init];

 p.language = ios;

 

    不遵守泛型僅僅是報警告

三.泛型在開發中的使用

    泛型在開發中使用場景:1.用於限制集合型別

    泛型好處:1.從陣列中取出來,可以使用點語法

            2.給陣列新增元素,有提示

@property (nonatomic,strong)NSMutableArray<NSString *> *arr;

限制資料裡面的集合是NSString

    id是不能使用點語法

    泛型注意點:在陣列中,一般用可變陣列新增方法,泛型才會生效,如果使用不可變陣列,新增元素,泛型沒有效果

四.泛型使用舉例

    什麼時候使用泛型?在宣告類的時候,不確定某些屬性或者方法型別,在使用這個類的時候才確定,就可以採用泛型

    自定義Person,會一些程式語言(iOS,Java),在宣告Person,不確定這個人會什麼,在使用Person才知道這個Person會什麼語言

    如果沒有定義泛型.預設就是id

<一>.先自定義類

1.自定義Person類.裡面有一個language屬性,不知道是什麼型別的,自定義為泛型,並且新增協變和逆變

//  Person.h

#import <Foundation/Foundation.h>

//第一步 宣告泛型

//__covariant 協變,子類轉父類   泛型名字是ObjectType

@interface Person<__covariant ObjectType> :NSObject

// 語言

@property (nonatomic,strong) ObjectType language;

@end

2.Language : NSObject

#import <Foundation/Foundation.h>

@interface Language : NSObject

@end

3.Java : Language

#import "Language.h"

@interface Java : Language

@end

4.iOS : Language

#import "Language.h"

@interface iOS : Language

@end


<二>定義好了,下面介紹如何使用
1.首先是沒有協變和逆變

#import <Foundation/Foundation.h>

// 泛型名字是ObjectType

@interface Person<ObjectType> : NSObject

// 語言

@property (nonatomic,strong) ObjectType language;

@end


- (void)test

{

    Java *java = [[Javaalloc]init];

    iOS *ios = [[iOSalloc]init];

    

    // iOS  指定這個人會的是iOS

    Person<iOS *> *p = [[Personalloc]init];

    p.language = ios;

    

    // Java   指定這個人會的是Java

    Person<Java *> *p1 = [[Personalloc]init];

    p1.language = java;


}


2.新增了協變

#import <Foundation/Foundation.h>

//第一步 宣告泛型

//__covariant 子類轉父類   泛型名字是ObjectType

@interface Person<__covariant ObjectType> : NSObject

// 語言

@property (nonatomicstrong) ObjectType language;

@end


// 子類轉父類

- (void)covariant

{

    iOS *ios = [[iOSalloc]init];

    Language *language = [[Languagealloc]init];

    // iOS 只會iOS

    Person<iOS *> *p = [[Personalloc]init];

    p.language = ios;

    

    // Language 都會

    Person<Language *> *p1 = [[Personalloc]init];

    p1 = p;

//如果沒新增協變會報指標型別錯誤警告

}


3.新增了逆變

#import <Foundation/Foundation.h>

//第一步 宣告泛型

//__contravariant 可以逆變,父類轉子類   泛型名字是ObjectType

@interface Person<__contravariant ObjectType> : NSObject

// 語言

@property (nonatomicstrong) ObjectType language;

@end


- (void)contravariant {

    //第二步 定義泛型

    iOS *ios = [[iOSalloc]init];

    Language *language = [[Languagealloc]init];

    

    // 父類轉子類  都會

    Person<Language *> *p = [[Personalloc]init];

    p.language = language;

    

    // iOS  只會iOS

    Person<iOS *> *p1 = [[Personalloc]init];

    p1 = p;  

//如果沒新增逆變會報指標型別錯誤警告

}



相關文章