iOS 开发中的泛型

在iOS开发中,泛型的使用,可以减少沟通的成本,明确类型。
相信大家在开发中,或多或少,都接触或使用过泛型。比如在定义一些装有特定类型的数组时,会这样写

NSMutableArray  *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 

@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 *p = [[Personalloc]init];

    p.language = ios;

 
    // Java   指定这个人会的是Java

    Person *p1 = [[Personalloc]init];

    p1.language = java;

}

__covariant:协变, 子类转父类
__contravariant:逆变 父类转子类

规范是死的,人是活的。 不能说我们定义了规范,就必须使用泛型。
如果需求是:数组内,分别有不同类型的对象,你还在纠结怎么用泛型。。。
总之,要具备这样的思想,而不是很刻板的去遵守。

你可能感兴趣的:(iOS 开发中的泛型)