iOS9关键字的简单使用
2016-07-18 12:22
316 查看
在iOS 9 苹果推出了很多关键字, 目的其实很明确, 主要就是提高开发人员的效率, 有益于程序员之间的沟通与交流, 在开发中代码更加规范!
nonnull : 表示不可以为 nil
这两个关键字只能修饰对象, 不能修饰基本数据类型, 可以用在属性, 方法的参数, 方法的返回值使用, 在默认情况下, 不加nullable, setter 和 getter 都是可以为nil
我们来看下如何使用, 以nullable为例如下:
Objective-C
@property (nonatomic, strong, nullable) NSArray *array;
@property (nonatomic, strong) NSArray * __nullable array;
@property (nonatomic, strong) NSArray * _Nullable array;
在方法中怎么使用呢? 我们来看看:
Objective-C
- (nonnull NSString *)testString:(nonnull NSString *)string;
- (NSString * _Nonnull)testString:(NSString * _Nonnull)string;
- (NSString * __nonnull)testString:(NSString * __nonnull)string;
我们在调用属性或者方法时候, 系统会提示你当前的对象是否为nil如下图:
另外还有2个宏如下:
Objective-C
NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END
在这两个宏之间的所有对象属性默认都是nonnull
关键字: null_resettable
getter :不可以为nil
setter :可以为nil
如果使用 null_resettable 就必须重写 getter或者setter方法. 目的是为了处理值为空的情况
使用方法如下:
Objective-C
@property (nonatomic, strong, null_resettable) UIView *testView;
关键字: _Null_unspecified
不确定是否为空, 此关键字个人感觉意义不是很大, 因为对象属性默认就是不确定的
使用方法如下:
Objective-C
@property (nonatomic, strong) UIView * _Null_unspecified testView;
@property (nonatomic, strong) UIView * __null_unspecified testView;
Objective-C
//属性使用
@property (nonatomic, strong) NSMutableArray *testArrayM;
//在方法中使用
- (NSArray *)testStringArray:(NSArray *)stringArray;
我们在数组中使用泛型, 之后我们可以很明确知道数组中是什么类型如下图:
在方法中使用泛型.png
在NSMutableArray中使用泛型.png
并且在上图我们可以了解到, 在集合里规定对象的类型, 通过集合取出来的对象可以当做泛型来使用, 并且可以直接用点语法, 可想而知泛型的好处是非常强大的!
协变/逆变
__covariant: 协变, 用于数据强制转换类型(子类可以转变父类)
__contravariant :逆变, 用于数据强制转换类型(父类可以转变子类)
我们先从 id 开始说起
最开始我们方法的返回值不确定,我们会使用 id 但是使用它会有不好之处, id在编译的时候不能检查真实类型, 并且返回值没有提示
Objective-C
- (id)testStringArray:(NSArray *)stringArray;
返回值使用id没有提示.png
所以苹果出现了 instancetype 它会自动识别当前对象是哪个类, 只能在返回值中使用, 但是在调用方法时候还是不知道返回什么类型
Objective-C
- (instancetype)testStringArray:(NSArray *)stringArray;
instancetype在编译能自动识别类型.png
最后苹果推出了 __kindof 它在调用时候很清楚的知道返回的类型, 在我们之前很多地方需要强制类型转换, 有了它就方便了很多
Objective-C
- (__kindof NSArray *)testStringArray:(NSArray *)stringArray;
__kindof使用.png
1. nullable 与 nonnull
nullable : 表示可以为 nilnonnull : 表示不可以为 nil
这两个关键字只能修饰对象, 不能修饰基本数据类型, 可以用在属性, 方法的参数, 方法的返回值使用, 在默认情况下, 不加nullable, setter 和 getter 都是可以为nil
我们来看下如何使用, 以nullable为例如下:
Objective-C
@property (nonatomic, strong, nullable) NSArray *array;
@property (nonatomic, strong) NSArray * __nullable array;
@property (nonatomic, strong) NSArray * _Nullable array;
1 2 3 | @property (nonatomic, strong, nullable) NSArray *array; @property (nonatomic, strong) NSArray * __nullable array; @property (nonatomic, strong) NSArray * _Nullable array; |
Objective-C
- (nonnull NSString *)testString:(nonnull NSString *)string;
- (NSString * _Nonnull)testString:(NSString * _Nonnull)string;
- (NSString * __nonnull)testString:(NSString * __nonnull)string;
1 2 3 | - (nonnull NSString *)testString:(nonnull NSString *)string; - (NSString * _Nonnull)testString:(NSString * _Nonnull)string; - (NSString * __nonnull)testString:(NSString * __nonnull)string; |
另外还有2个宏如下:
Objective-C
NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END
1 2 | NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END |
关键字: null_resettable
getter :不可以为nil
setter :可以为nil
如果使用 null_resettable 就必须重写 getter或者setter方法. 目的是为了处理值为空的情况
使用方法如下:
Objective-C
@property (nonatomic, strong, null_resettable) UIView *testView;
1 | @property (nonatomic, strong, null_resettable) UIView *testView; |
不确定是否为空, 此关键字个人感觉意义不是很大, 因为对象属性默认就是不确定的
使用方法如下:
Objective-C
@property (nonatomic, strong) UIView * _Null_unspecified testView;
@property (nonatomic, strong) UIView * __null_unspecified testView;
1 2 | @property (nonatomic, strong) UIView * _Null_unspecified testView; @property (nonatomic, strong) UIView * __null_unspecified testView; |
2. 泛型
通过使用泛型, 我们可以非常容易地获取其中的元素,并访问其特有的属性和方法, 一般使用在集合中使用(例如:数组,字典), 当方法调用的时候才有效果, 我们来看看如何使用:Objective-C
//属性使用
@property (nonatomic, strong) NSMutableArray *testArrayM;
//在方法中使用
- (NSArray *)testStringArray:(NSArray *)stringArray;
1 2 3 4 | //属性使用 @property (nonatomic, strong) NSMutableArray *testArrayM; //在方法中使用 - (NSArray *)testStringArray:(NSArray *)stringArray; |
在方法中使用泛型.png
在NSMutableArray中使用泛型.png
并且在上图我们可以了解到, 在集合里规定对象的类型, 通过集合取出来的对象可以当做泛型来使用, 并且可以直接用点语法, 可想而知泛型的好处是非常强大的!
协变/逆变
__covariant: 协变, 用于数据强制转换类型(子类可以转变父类)
__contravariant :逆变, 用于数据强制转换类型(父类可以转变子类)
3. __kindof
表示当前类, 或者它的子类(__kindof使用: 放在类型前面, 表示修饰此类型)我们先从 id 开始说起
最开始我们方法的返回值不确定,我们会使用 id 但是使用它会有不好之处, id在编译的时候不能检查真实类型, 并且返回值没有提示
Objective-C
- (id)testStringArray:(NSArray *)stringArray;
1 | - (id)testStringArray:(NSArray *)stringArray; |
返回值使用id没有提示.png
所以苹果出现了 instancetype 它会自动识别当前对象是哪个类, 只能在返回值中使用, 但是在调用方法时候还是不知道返回什么类型
Objective-C
- (instancetype)testStringArray:(NSArray *)stringArray;
1 | - (instancetype)testStringArray:(NSArray *)stringArray; |
instancetype在编译能自动识别类型.png
最后苹果推出了 __kindof 它在调用时候很清楚的知道返回的类型, 在我们之前很多地方需要强制类型转换, 有了它就方便了很多
Objective-C
- (__kindof NSArray *)testStringArray:(NSArray *)stringArray;
1 | - (__kindof NSArray *)testStringArray:(NSArray *)stringArray; |
__kindof使用.png
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 我是运营,我没有假期
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- android上改变listView的选中颜色
- String.intern
- 开发人员、程序员与计算机科学家三者之间的区别
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- DB2数据库的安装
- Prototype源码浅析 String部分(二)
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- Ruby中的String对象学习笔记