iOS9新特性之泛型

 iOS9新特性之泛型

作用:限制类型

好处:1.提高开发规范,减少程序员之间的交流

      2.通过集合取出来的对象,直接当作泛型对象使用,可以直接使用点语法(id类型不能使用点语法)

使用场景: 1.在集合(数组、字典、NSSet)中使用泛型比较常见

           2.当声明一个类,类里面的某些属性的类型不确定,这时候才使用泛型

书写规范:

场景1示例

@property (nonatomic ,strong)NSMutableArray<NSString*> *datas;

场景2示例

Person类中

#import <Foundation/Foundation.h>

#import "Language.h"

#import "iOS.h"

#import "Java.h"

@interface Person<languageType,companyType> : NSObject

@property (nonatomic)  languageType language;

@property (nonatomic)  companyType company;

@end

ViewController类中

#import "ViewController.h"

#import "Person.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    Person *person = [[Person alloc] init];

    person.language = @"123";

   // 不限制类型时,相当于id类型

    Person<iOS *,NSString *> *person1 = [[Person alloc] init];

    person1.language = [[iOS alloc] init];

    person1.company = @"百度有限公司";

    Person<Java *,NSArray *> *person2 = [[Person alloc] init];

    person2.language = [[Java alloc] init];

    person2.company = @[@"百度有限公司"];

 }

@end

泛型的协变与逆变

协变:__covariant用于泛型数据强转类型,可以向上强转,子类可以转成父类

Person类中

#import <Foundation/Foundation.h>

#import "Language.h"

#import "iOS.h"    (iOS的父类为Language).

@interface Person<__covariant languageType> :NSObject

@property (nonatomic)  languageType language;

@end

ViewController中

    Person<Language *> *person = [[Person alloc] init];

    Person<iOS *> *person1 = [[Person alloc] init];

person = person1; //子类给父类赋值

逆变 :__contravariant用于泛型数据强转类型,可以向下强转,父类可以转成子类

@interface Person<__ contravariant languageType> :

    person1 = person; //父类给子类赋值

原文地址:https://www.cnblogs.com/culing/p/5715556.html