美文网首页
[iOS] 泛型ObjectType 协变__covariant

[iOS] 泛型ObjectType 协变__covariant

作者: 汴城码匠 | 来源:发表于2019-12-25 16:06 被阅读0次

一.泛型作用

泛型:限制类型 

为什么要推出泛型:迎合swift

泛型作用:1.限制类型 2.提高代码规划,减少沟通成本,一看就知道集合中是什么东西

二.泛型用法:

__covariant:协变, 子类转父类 

__contravariant:逆变 父类转子类
1.泛型声明:在声明类的时候,在类的后面<泛型名称>
 //第一步 声明泛型
 @interface Person<__covariant ObjectType> : NSObject
 // 语言
 @property (nonatomic, strong) ObjectType language;
2.使用泛型 类型<限制类型>
 // iOS
 Person<iOS *> *p = [[Person alloc] init];
 p.language = ios;

不遵守泛型仅仅是报警告

三.泛型在开发中的使用

泛型在开发中使用场景:1.用于限制集合类型

泛型好处:1.从数组中取出来,可以使用点语法

        2.给数组添加元素,有提示

@property (nonatomic,strong)NSMutableArray<NSString *> *arr;
限制数据里面的集合是NSString
id是不能使用点语法

泛型注意点:1.在数组中,一般用可变数组添加方法,泛型才会生效,如果使用不可变数组,添加元素,泛型没有效果

四.泛型使用举例

什么时候使用泛型: 在声明类的时候,不确定某些属性或者方法类型,在使用这个类的时候才确定,就可以采用泛型

自定义Person,会一些编程语言(iOS,Java),在声明Person,不确定这个人会什么,在使用Person才知道这个Person会什么语言
如果没有定义泛型.默认就是id

<一>.先自定义类

1.自定义Person类.里面有一个language属性,不知道是什么类型的,自定义为泛型,并且添加协变和逆变

//  Person.h

#import <Foundation/Foundation.h>

//第一步 声明泛型

//__covariant 协变,子类转父类   泛型名字是ObjectType

@interface Person<__covariant ObjectType> :NSObject

// 语言

@property (nonatomic,strong) ObjectType language;

@end

2.Language : NSObject

#import <Foundation/Foundation.h>

@interface Language : NSObject

@end

3.Java : Language

#import "Language.h"

@interface Java : Language

@end

4.iOS : Language

#import "Language.h"

@interface iOS : Language

@end

<二>定义好了,下面介绍如何使用
1.首先是没有协变和逆变

#import <Foundation/Foundation.h>

// 泛型名字是ObjectType

@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;



}

2.添加了协变

#import <Foundation/Foundation.h>

//第一步 声明泛型

//__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;

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

}

3.添加了逆变

#import <Foundation/Foundation.h>

//第一步 声明泛型

//__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;  

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

}

个人理解:协变逆变的作用就是,对象相互赋值时,对象属性(泛型)的处理

协变:`对象(属性泛型子类)`赋予`对象( 属性泛型父类)`
逆变:`对象(属性泛型父类)`赋予`对象( 属性泛型子类)`

相关文章

  • iOS 泛型 ObjectType 协变 __covariant

    泛型使用场景: 在集合(数组、字典、NSSet)中使用泛型比较常见。 当声明一个类,类里面的某些属性的类型不确定,...

  • [iOS] 泛型ObjectType 协变__covariant

    一.泛型作用 二.泛型用法: 1.泛型声明:在声明类的时候,在类的后面<泛型名称> 2.使用泛型 类型<限制类型>...

  • iOS 泛型 ObjectType 协变 __covariant

    泛型使用场景: 在集合(数组、字典、NSSet)中使用泛型比较常见。 当声明一个类,类里面的某些属性的类型不确定,...

  • iOS 泛型 ObjectType 协变 __covariant

    泛型使用场景: 在集合(数组、字典、NSSet)中使用泛型比较常见。当声明一个类,类里面的某些属性的类型不确定,这...

  • Kotlin 泛型中的 in 和 out

    协变 在 Java 的泛型系统中. 泛型默认是不支持协变(covariant). 也就是说在 Java 中. 即使...

  • 泛型编程中的型变

    在泛型编程中,经常会提到型变。型变分为两种:协变与逆变。协变covariant表示与泛型参数T的变化相同,而逆变c...

  • iOS9新特性之泛型 和__kindof

    泛型:限制类型 __covariant(协变):用于泛型数据强转类型,可以向上强转,子类 可以转成 父类__con...

  • Scala 泛型协变与泛型边界

    代码准备 泛型协变 泛型协变、逆变、不变是指拥有泛型的类在声明和赋值时的对应关系。 协变:声明时泛型是父类,赋值时...

  • OC中的ObjectType是什么类型

    ObjectType是Objective-C中的泛型 ObjectType的使用 自定义泛型只能在 @interf...

  • 第二十八条:列表优先数组

    数组与泛型相比,有两个重要的不同点。首先,数组是协变的(covariant)。这个词听起来有点吓人,其实只是表示如...

网友评论

      本文标题:[iOS] 泛型ObjectType 协变__covariant

      本文链接:https://www.haomeiwen.com/subject/debcoctx.html