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; //父类给子类赋值