一、iOS9新出的关键字
作用:用于修饰属性,方法参数,方法返回值
好处:1.迎合swift
2.提高开发人员的规范,减少程序员之间的交流
关键字:nonnull 对象非空
nullable 对象可以为空
null_resettable :get:不能返回为空, set可以为空
注意:这些关键字只用来修饰对象,并不能用来修饰数据类型。如果使用null_resettable,必须重写get方法或者set方法,处理传递的值为空的情况
几种定义的方式:(如果在使用这些成员变量时没有按照关键字约束赋值,系统会报警告)
@property(nonatomic,copy,nonnull)NSString *icon;
@property(nonatomic,copy)NSString * _Nonnull icon1;
@property(nonatomic,copy)NSString * __nonnull icon2;
NS_ASSUME_NONNULL_BEGIN
@property(nonatomic,copy)NSString *name;
NS_ASSUME_NONNULL_END
二、泛型、协变、逆变
泛型:限制类型
泛型使用场景:
1.在集合(数组,字典,nsset)中使用泛型比较常见
2.当申明一个类时,其中一些属性的类型不确定时,这时我们才使用泛型
泛型书写规范:
在类型后面定义泛型类型
@property (nonatomic, strong) NSMutableArray<NSString *> *datas;
泛型好处:
1.提高开发规范,减少程序员之间的交流
2.通过集合取出对象,直接当做泛型类型的对象使用,可以直接使用点语法
下面看个例子:
person类有个language属性,当我们实例化person时,加入了iOS泛型,这样我们给language属性赋值时就会提示它的类型为iOS类。这时赋值其它类型时系统会报警告。但如果泛型没有确定时,这时返回类型是id。
__covariant(协变):用于泛型数据强转类型,可以向上强转,子类 可以转成 父类
__contravariant(逆变):用于泛型数据强转类型,可以向下强转, 父类 可以 转成子类
以协变为例:
// 首先声明泛型
@interface Person<__covariant ObjectType> : NSObject
代码实现:
Person<Language *> *p = [[Person alloc] init];
Person<IOS *> *iosP = [[Person alloc] init];
iosP.language = [[IOS alloc] init];
// iosP = p;
p = iosP;//子类转成父类
__kindof表示当前类或者它的子类,使用__kindof,在调用的时候很清楚的知道返回值的类型
__kindof Person *:表示可以是Person类或者它的子类
使用id坏处:
1.不能在编译时检查真实类型
2.返回值,没有提示