iOS 泛型 ObjectType 协变 __covariant 逆变 __contravariant

泛型使用场景:

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

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

NSMutableArray<UITouch *> *datas

泛型好处:

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

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

例如:

// __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
  • 首先是没有添加协变和逆变
@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;
}
  • 添加了协变
// __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;

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

    // 如果没添加逆变会报指针类型错误警告
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DannyHoo的专栏

NSCharacterSet类在分割字符串中的应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

10720
来自专栏desperate633

[编程题] DNA片段分析代码

简单题。思路就是直接暴力搜索。从第一个字母开始判断,找到最长的,再从第二个字母开始。

9210
来自专栏bboysoul

1176: C语言实验题――数组逆序

描述:输入10个整数存入一维数组,再按逆序重新存放后再输出。 输入:输入包括一行。 10个以空格格开的整数 输出:逆序的10个整数,整数以空格格开 样例输...

22840
来自专栏赵俊的Java专栏

合并区间

21430
来自专栏菩提树下的杨过

c#4.0中的不变(invariant)、协变(covariant)、逆变(contravariant)小记

不变/协变/逆变,4.0中的这几个概念越念越象绕口令,如果单纯死记硬背,就算记住了,时间长了还是会忘记的。 园子里已经有不少高手撰文写过这个话题:比如“装配脑袋...

203100
来自专栏程序员宝库

如何用JavaScript手动实现一个栈

在生活中也能发现很多栈的例子。例如,厨房里堆放的盘子,总是叠在上方的先被使用;输入框内容进行删除时,总是最后输入的先删除;弹夹中的子弹,越后装入的,越先发射.....

12840
来自专栏屈定‘s Blog

Java8 Lambda(一)-函数式接口

实习前只是粗略的看了下Java8的一些基本语法,但是没有系统的学习过.在使用一段时间后决定系统的对其进行一次分析,加深对Java8函数式编程的理解,提高自己的编...

71730
来自专栏青玉伏案

Objective-C中的继承和多态

   面向对象编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的OOP语言之间都有其特点。OC中和Java类...

22380
来自专栏wOw的Android小站

[Objective-C] id类型和instancetype类型

id数据类型可以存储任何类型的对象。可以说,它是一般对象类型。 例如可以声明一个为id类型的变量:

11310
来自专栏偏前端工程师的驿站

JS魔法堂:再识Number type

Brief                                   本来只打算理解JS中0.1 + 0.2 == 0.300000000000000...

23650

扫码关注云+社区

领取腾讯云代金券