iOS9新特性常见关键字
- 关键字推出: 为迎合Swift语言, 在Swift中任何一个对象都需要约束是否为空
- 关键字的好处: 提高开发规范
- 关键字的作用: 在方法中才发挥作用
关键字在属性的使用
nullable: get方法的返回值, set方法的参数可以为空
1 | nullable:get,set可能为空 |
nonnull: get方法的返回值, set方法的参数都是非空的
1 | nonnull:get,set非空 |
null_resettable: get方法的返回值不可以为空, set方法的参数可以为空
1 | null_resettable:set可以为空,get不可以为空 |
- 会报警告, set方法没有处理可能为空的情况
- 必须要处理为nil的情况, 重写get方法
Null_unspecified 不确定是否为空
在设置了上述三个关键字属性之后, 用点语法
调用get/set方法时候, 不能确定调用的是get还是set, 也就不能确定能否为空
关键字在方法的使用
1 | - (nonnull NSString *)test |
关键字的注意点:
只能用于对象类型
NS_ASSUME_NONNULL_BEGIN
与NS_ASSUME_NONNULL_END之
间所有的对象都是nonnull
1 | NS_ASSUME_NONNULL_BEGIN |
iOS9新特性泛型
泛型作用: 限制类型
泛型在开发中的使用场景:
- 用于集合(数组, 字典, NSSet)
- 当声明一个类的时候, 某个属性不确定类型
泛型好处
- 提高开发规范, 一看就知道集合中放什么类型
- 直接从集合中取出的对象可以知道是什么类型, 直接使用点语法
泛型的书写
如何声明泛型: 在声明一个类的时候, 在类型后面<泛型名称>
1
@interface NSArray<ObjectType> (NSExtendedArray)
如何定义泛型: 在类型后面限制, <限制的类型>, 泛型的名称可以随意取
1
2
3
4
5// 字典的key是字符串, value是id类型
NSDictionary<NSString *, id> *dict;
// 数组里是NSNumber类型
NSArray<NSNumber *> *arr;
注意
- 并不是任何对象都能使用泛型
- 泛型只用于方法调用
- 因此在不可变数组里面泛型是没有意义的
自定义泛型(声明泛型)
1 |
|
1 | - (void)viewDidLoad { |
泛型中数据转换: 协变和逆变
__covariant 协变, 向上强转, 子类转父类
__contravariant 逆变, 向下强转, 父类转子类
1 | Person<Language *> *p1 = [[Person alloc] init]; |
iOS9新特性 __kindof
__kindof, 用于修饰对象, 用于方法返回值, 描述返回类型是当前类或者子类
1 | // 譬如该方法, __kindof关键字很好的解决了返回自定义cell的问题 |
返回值类型的演变id –> instancetype –> __kindof
id:
- 不能使用点语法
- 能够调用任何对象的方法, 导致不能进行编译检查
instancetype:
- 会自动识别当前类的对象, 可以进行编译检查
但是, 不论id还是instancetype, 返回值并不知道返回的是什么类型, __kindof既解决了知道返回值类型的问题, 有解决了返回子类报警告的问题