文档章节

第01天实战技术(04):iOS9新特性之泛型(协变和逆变)

宇鸿165
 宇鸿165
发布于 2017/03/24 10:10
字数 581
阅读 0
收藏 0

#####一、新特性之泛型(协变和逆变)

 泛型 : __covariant:(协变) 允许子类转父类
 __contravariant:(逆变)  允许父类转子类
类设置协变和逆变
Person
@interface Person<__covariant ObjceType> : NSObject //允许子类转父类
@interface Person<__contravariant ObjceType> : NSObject // 允许父类转子类

 父子关系
 父 : Language
 子 : iOS、Java
  • 1.协变和逆变的作用
    用于父子 类型转换
  • 2.泛型注意点
    泛型注意点: 在数组中,一般用可变数组添加方法,泛型才会生效,如果使用不可变数组,添加元素,泛型是没有效果的
@property(nonatomic) NSArray<NSString *> *t;
    _t = @[@"13",@1]; // 不会出现任何的警告
  • 3.__covariant:(协变)
__covariant:允许子类转父类

Person
@interface Person<__covariant ObjceType> : NSObject
// 语言
@property(nonatomic) ObjceType language;
@end
-----------

#pragma mark 子类转父类 (__covariant)
- (void)covariant
{
    iOS *ios = [[iOS alloc]init];   // 儿子
    Language *language = [[Language alloc]init]; // 爸爸
    
    // 1.iOS
    Person<iOS *> *p = [[Person alloc]init];
    p.language = ios;
    // 2.会2种语言
    Person<Language *> *p1;
    // 如果想编译通过 那么 就需要 子类转父类
    p1 = p; //(子类转父类 用 协变__covariant) 类型不匹配 incompatible pointer types assigning to 'Person<Language *>' form 'Person<iOS *>'
}
  • 4.__contravariant:(逆变)
__contravariant:允许父类转子类

Person
@interface Person<__contravariant ObjceType> : NSObject
// 语言
@property(nonatomic) ObjceType language;
@end

-----------
- (void)contravariant
{
#pragma mark 父类转子类 (__contravariant)
    iOS *ios = [[iOS alloc]init];   // 儿子
    Language *language = [[Language alloc]init]; // 爸爸
    
    // 父类转子类
    Person<Language *> *p = [[Person alloc]init];
    p.language = language;
    
    // iOS
    Person<iOS *> *p1 =[[Person alloc]init];
    p1 = p; //(父类转子类 用 逆变__contravariant) 类型不匹配 incompatible pointer types assigning to 'Person<iOS *>' form 'Person<Language *>'
}

code

#import "ViewController.h"
#import "Person.h"
#import "iOS.h"
#import "Java.h"
@interface ViewController ()
@property(nonatomic) NSMutableArray<NSString *> *arr; // 只想存放 字符串
@property(nonatomic) NSArray<NSString *> *t;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _t = @[@"13",@1];
}
- (void)contravariant
{
#pragma mark 父类转子类 (__contravariant)
    iOS *ios = [[iOS alloc]init];   // 儿子
    Language *language = [[Language alloc]init]; // 爸爸
    
    // 父类转子类
    Person<Language *> *p = [[Person alloc]init];
    p.language = language;
    
    // iOS
    Person<iOS *> *p1 =[[Person alloc]init];
    p1 = p; //(父类转子类 用 逆变__contravariant) 类型不匹配 incompatible pointer types assigning to 'Person<iOS *>' form 'Person<Language *>'
}

#pragma mark 子类转父类 (__covariant)
- (void)covariant
{
    iOS *ios = [[iOS alloc]init];   // 儿子
    Language *language = [[Language alloc]init]; // 爸爸
    
    // 1.iOS
    Person<iOS *> *p = [[Person alloc]init];
    p.language = ios;
    // 2.会2种语言
    Person<Language *> *p1;
    // 如果想编译通过 那么 就需要 子类转父类
    p1 = p; //(子类转父类 用 协变__covariant) 类型不匹配 incompatible pointer types assigning to 'Person<Language *>' form 'Person<iOS *>'
}
@end

© 著作权归作者所有

宇鸿165
粉丝 1
博文 919
码字总数 368963
作品 0
广州
私信 提问
协变和逆变(转载)

前言 个人感觉协变(Covariance)与逆变(Contravariance)是 C# 4 中最难理解的一个特性了,因为 C# 4 用了一个非常直观的语法(和关键字),在很多情况下,这似乎很简单,用于输入的参数,用于...

jeffcky
2015/08/15
0
0
C# 4.0新特性-"协变"与"逆变"以及背后的编程思想

在《上篇》中我们揭示了“缺省参数”的本质,现在我们接着来谈谈C#4.0中另一个重要的新特性:协变(Covariance)与逆变(Contravariance)。对于协变与逆变,大家肯定不会感到陌生,但是我相...

长平狐
2012/09/04
396
0
[Unity脚本运行时更新]C#4新特性

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhenghongzhi6/article/details/82776896 洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号。 本文是该...

关尔Manic
2018/09/19
0
0
谈谈.Net中的协变和逆变

谈谈.Net中的协变和逆变 关于协变和逆变要从面向对象继承说起。继承关系是指子类和父类之间的关系;子类从父类继承所以子类的实例也就是父类的实例。比如说Animal是父类,Dog是从Animal继承的...

长平狐
2012/06/08
89
0
Java泛型的协变、逆变和不变

背景 平时在看一些开源框架源码时总发现他们会或多或少的用到泛型来定义数据类型。这可以理解,毕竟牛逼的开源框架大都是为了解决一类普遍问题而存在的;但看不懂的是,有时参数或者返回值会...

JarryWell
2018/07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部