一.泛型作用
泛型:限制類型
爲什麼要推出泛型?迎合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;
限制數據裏面的集合是NSStringid是不能使用點語法
泛型注意點:在數組中,一般用可變數組添加方法,泛型纔會生效,如果使用不可變數組,添加元素,泛型沒有效果
四.泛型使用舉例
什麼時候使用泛型?在聲明類的時候,不確定某些屬性或者方法類型,在使用這個類的時候才確定,就可以採用泛型
自定義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
#import <Foundation/Foundation.h>
@interface Language : NSObject
@end
#import "Language.h"
@interface Java : Language
@end
#import "Language.h"
@interface iOS : Language
@end
#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;
}
#import <Foundation/Foundation.h>
//第一步 聲明泛型
//__covariant 子類轉父類 泛型名字是ObjectType
@interface Person<__covariant ObjectType> : NSObject
// 語言
@property (nonatomic, strong) 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;
//如果沒添加協變會報指針類型錯誤警告
}
#import <Foundation/Foundation.h>
//第一步 聲明泛型
//__contravariant 可以逆變,父類轉子類 泛型名字是ObjectType
@interface Person<__contravariant ObjectType> : NSObject
// 語言
@property (nonatomic, strong) 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;
//如果沒添加逆變會報指針類型錯誤警告
}