一.泛型作用
泛型:限制類型
為什么要推出泛型?迎合swift
泛型作用:1.限制類型 2.提高代碼規(guī)劃,減少溝通成本,一看就知道集合中是什么東西
二.泛型用法:
__covariant:協(xié)變, 子類轉(zhuǎn)父類
__contravariant:逆變 父類轉(zhuǎn)子類
1.泛型聲明:在聲明類的時(shí)候,在類的后面<泛型名稱>
//第一步 聲明泛型
@interface Person<__covariant ObjectType> : NSObject
// 語言
@property (nonatomic, strong) ObjectType language;
2.使用泛型 類型<限制類型>
// iOS
Person<iOS *> *p = [[Person alloc] init];
p.language = ios;
不遵守泛型僅僅是報(bào)警告
三.泛型在開發(fā)中的使用
泛型在開發(fā)中使用場景:1.用于限制集合類型
泛型好處:1.從數(shù)組中取出來,可以使用點(diǎn)語法
2.給數(shù)組添加元素,有提示
@property (nonatomic,strong)NSMutableArray<NSString *> *arr;
限制數(shù)據(jù)里面的集合是NSString
id是不能使用點(diǎn)語法
泛型注意點(diǎn):在數(shù)組中,一般用可變數(shù)組添加方法,泛型才會(huì)生效,如果使用不可變數(shù)組,添加元素,泛型沒有效果
四.泛型使用舉例
什么時(shí)候使用泛型?在聲明類的時(shí)候,不確定某些屬性或者方法類型,在使用這個(gè)類的時(shí)候才確定,就可以采用泛型
自定義Person,會(huì)一些編程語言(iOS,Java),在聲明Person,不確定這個(gè)人會(huì)什么,在使用Person才知道這個(gè)Person會(huì)什么語言
如果沒有定義泛型.默認(rèn)就是id
<一>.先自定義類
1.自定義Person類.里面有一個(gè)language屬性,不知道是什么類型的,自定義為泛型,并且添加協(xié)變和逆變
// Person.h
#import <Foundation/Foundation.h>
//第一步 聲明泛型
//__covariant 協(xié)變,子類轉(zhuǎn)父類 泛型名字是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.首先是沒有協(xié)變和逆變
#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 指定這個(gè)人會(huì)的是iOS
Person<iOS *> *p = [[Personalloc]init];
p.language = ios;
// Java 指定這個(gè)人會(huì)的是Java
Person<Java *> *p1 = [[Personalloc]init];
p1.language = java;
}
2.添加了協(xié)變
#import <Foundation/Foundation.h>
//第一步 聲明泛型
//__covariant 子類轉(zhuǎn)父類 泛型名字是ObjectType
@interface Person<__covariant ObjectType> : NSObject
// 語言
@property (nonatomic, strong) ObjectType language;
@end
// 子類轉(zhuǎn)父類
- (void)covariant
{
iOS *ios = [[iOSalloc]init];
Language *language = [[Languagealloc]init];
// iOS 只會(huì)iOS
Person<iOS *> *p = [[Personalloc]init];
p.language = ios;
// Language 都會(huì)
Person<Language *> *p1 = [[Personalloc]init];
p1 = p;
//如果沒添加協(xié)變會(huì)報(bào)指針類型錯(cuò)誤警告
}
3.添加了逆變
#import <Foundation/Foundation.h>
//第一步 聲明泛型
//__contravariant 可以逆變,父類轉(zhuǎn)子類 泛型名字是ObjectType
@interface Person<__contravariant ObjectType> : NSObject
// 語言
@property (nonatomic, strong) ObjectType language;
@end
- (void)contravariant {
//第二步 定義泛型
iOS *ios = [[iOSalloc]init];
Language *language = [[Languagealloc]init];
// 父類轉(zhuǎn)子類 都會(huì)
Person<Language *> *p = [[Personalloc]init];
p.language = language;
// iOS 只會(huì)iOS
Person<iOS *> *p1 = [[Personalloc]init];
p1 = p;
//如果沒添加逆變會(huì)報(bào)指針類型錯(cuò)誤警告
}