?iOS9新特性之常见关键字
iOS9出了很多关键字,研究下苹果为什么要新推出关键字.
研究方法:在新版本的Xcode创建一个空的项目,在老版本的Xcode打开,发现很多错误
研究新的东西:两点(1.怎么去用(书写格式) 2.关键字有什么作用)
关键字作用:仅仅是提示,并不会报编译错误.
关键字开发好处:
1.提高代码规范,减少交流时间,把更多精力放在开发中.
2.迎合swift,swift强引用,必须指定这个属性是否为空.
iOS9:Xcode7
iOS8:Xcode6
iOS7:Xcode5
关键字作用:仅仅是提示,并不会报编译错误.
关键字开发好处:
1.提高代码规范,减少交流时间,把更多精力放在开发中.
2.迎合swift,swift强引用,必须指定这个属性是否为空.
iOS9:Xcode7
iOS8:Xcode6
iOS7:Xcode5
iOS6:Xcode4 2013 6月份 Xcode4.6
注意:
1.关键字只能用来描述对象,不能描述基本数据类型(int等等)
2.默认系统如果没有使用关键字,默认(对象属性)就是nonnull
2.默认系统如果没有使用关键字,默认(对象属性)就是nonnull
3.在NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END之间,系统对象默认就是nonnull
------------------------------------------------------------------
nullable作用:可能为空,表示属性可以传入空,在访问属性和调用方法都会提示
nonnull作用:不能为空
null_resettable作用:声明属性:get 方法不能为空, set 方法可以为空
注意:
null_resettable:处理为空的情况
_Null_unspecified作用:不确定
研究方法:⬇️
以nullable为例
格式(模仿):
1.方式一:(策略)
@property (nonatomic, strong, nullable) NSString *name;
2.方式二:_Nullable(*后面,变量名前面)
@property (nonatomic, strong) NSString * _Nullable name;
3.方式三:__nullable(*后面,变量名前面),xcode7beta(测试版本)
1.方式一:(策略)
@property (nonatomic, strong, nullable) NSString *name;
2.方式二:_Nullable(*后面,变量名前面)
@property (nonatomic, strong) NSString * _Nullable name;
3.方式三:__nullable(*后面,变量名前面),xcode7beta(测试版本)
@property (nonatomic, strong) NSString * __nullable name;
?
iOS9新特性之泛型
苹果为什么推出泛型:
泛型好处:
1.迎合swift
2.提高代码规范,一看便知是什么类型
泛型作用:
1.限制类型(主要是限制集合中是什么类型)
2.从集合中取出来,可以使用点语法,不使用泛型,不能使用点语法.
泛型格式:
声明泛型格式: 在声明类型的后面<类型>
定义泛型格式: 在使用类型后面<类型>
注意点:泛型仅仅报警告,并不是编译错误.
数组里不能传入nil,真的会报错(运行).
疑问:为什么集合可以使用泛型.
并不是任何系统类型,都可以使用泛型,一般是集合(NSSet,字典,数组)
字典使用泛型格式:NSDictionary<NSString *,id>
泛型开发中使用场景(需求):声明类的时候不确定,使用类型创建对象才确定,就可以使用泛型
比如有个人,在声明这个Person类,并不知道会哪些编程语言(iOS,Java),在创建这个人类的时候,才确定他会什么.
泛型好处:
1.迎合swift
2.提高代码规范,一看便知是什么类型
泛型作用:
1.限制类型(主要是限制集合中是什么类型)
2.从集合中取出来,可以使用点语法,不使用泛型,不能使用点语法.
泛型格式:
声明泛型格式: 在声明类型的后面<类型>
定义泛型格式: 在使用类型后面<类型>
注意点:泛型仅仅报警告,并不是编译错误.
数组里不能传入nil,真的会报错(运行).
疑问:为什么集合可以使用泛型.
并不是任何系统类型,都可以使用泛型,一般是集合(NSSet,字典,数组)
字典使用泛型格式:NSDictionary<NSString *,id>
泛型开发中使用场景(需求):声明类的时候不确定,使用类型创建对象才确定,就可以使用泛型
比如有个人,在声明这个Person类,并不知道会哪些编程语言(iOS,Java),在创建这个人类的时候,才确定他会什么.
自定义泛型?在声明自定义类的时候,声明泛型,在使用自定义类的时候,定义泛型
声明泛型:<泛型名称>
定义泛型:<什么类型>
这个泛型就可以充当一个类型使用
__covariant:
协变: 子类转父类
__contravariant 逆变: 父类转子类
用于类型转换
观察 -> 总结
__kindof用法:用于返回值,在类型前面声明
__kindof作用:相当于,描述当前类或者子类
__kindof用法:用于返回值,在类型前面声明
__kindof作用:相当于,描述当前类或者子类