美文网首页
[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

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