前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS 泛型 ObjectType 协变 __covariant 逆变 __contravariant

iOS 泛型 ObjectType 协变 __covariant 逆变 __contravariant

作者头像
s_在路上
发布2018-09-30 10:55:59
3.4K0
发布2018-09-30 10:55:59
举报
文章被收录于专栏:iOS 开发杂谈iOS 开发杂谈

泛型使用场景:

  • 在集合(数组、字典、NSSet)中使用泛型比较常见。
  • 当声明一个类,类里面的某些属性的类型不确定,这时候我们才使用泛型。

泛型书写规范 在类型后面定义泛型:

代码语言:javascript
复制
NSMutableArray<UITouch *> *datas

泛型好处:

  • 提高开发规范,减少程序员之间交流
  • 通过集合取出来对象,直接当做泛型对象使用,可以直接使用点语法。

__covariant(协变):用于泛型数据强转类型,可以向上强转,子类可以转成父类。 __contravariant(逆变):用于泛型数据强转类型,可以向下强转,父类可以转成子类。

例如:

代码语言:javascript
复制
// __covariant 协变,子类转父类;泛型名字是ObjectType
@interface Person<__covariant ObjectType> :NSObject

// 语言
@property (nonatomic, strong) ObjectType language;

@end

@interface Language : NSObject

@end

@interface Java : Language

@end

@interface iOS : Language

@end
  • 首先是没有添加协变和逆变
代码语言:javascript
复制
@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;
}
  • 添加了协变
代码语言:javascript
复制
// __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;

    // 如果没添加协变会报指针类型错误警告
}
  • 添加了逆变
代码语言:javascript
复制
// __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;  

    // 如果没添加逆变会报指针类型错误警告
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.09.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档