在iOS开发中,泛型的使用,可以减少沟通的成本,明确类型。
相信大家在开发中,或多或少,都接触或使用过泛型。比如在定义一些装有特定类型的数组时,会这样写
NSMutableArray <CarModel *> *dataSource
这样就表明了,dataSource这个数组中,放的是CarModel。使用objectForKey 可以直接用点语法,点出模型内部的属性进行使用。
[self.dataSource objectAtIndex:0].property;
在给数组添加数据时,也会有提示指明数组中的类型。
[self.dataSource addObject:(nonnull CarModel *)];
如果添加了错误的类型,会有警告。
[self.dataSource addObject:@""];
Incompatible pointer types sending 'NSString *' to parameter of type 'CarModel * _Nonnull'
自定义泛型类
在声明类的时候,不确定某些属性或者方法类型,在使用这个类的时候才确定,就可以采用泛型。
在声明类的时候,在类的后面<泛型名称>
@interface Person<__covariant ObjectType> : NSObject
@property (nonatomic, strong) ObjectType language;
Language : NSObject
#import <Foundation/Foundation.h>
@interface Language : NSObject
@end
.Java : Language
#import "Language.h"
@interface Java : Language
@end
.iOS : Language
#import "Language.h"
@interface iOS : 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;
}
__covariant:协变, 子类转父类
__contravariant:逆变 父类转子类
规范是死的,人是活的。 不能说我们定义了规范,就必须使用泛型。
如果需求是:数组内,分别有不同类型的对象,你还在纠结怎么用泛型。。。
总之,要具备这样的思想,而不是很刻板的去遵守。