title: 浅析nonnull和nullable
date: 2016-11-17 14:59:50
categories:
- iOS_SHAKALAKA
tags: - iOS
- nonnull
- nullable
浅析nonnull和nullable
为了对应Swift中的optional和non-optional,Xcode6.3推出了一个新特性,就是 nullable
和 nonnull
简单来讲,nullable 表示对象可以是NULL或nil,nonnull 表示对象不可以为空,当我们不遵循上述规则时,编译器就会警告。
下面简单示范一下这两个东西的用法!
声明属性有两种写法。
第一种写法
@property (nonatomic, copy, nullalbe) NSString *name;
@property (nonatomic, strong, nonnull) UITableView *tableView;
第二种写法
@property (nonatomic, copy) NSString * __nullabel name;
@property (nonatomic, strong) UITableView * __nonnull tableView;
个人推荐第一种写法,简单清晰明了。
声明方法的参数也有两种写法
第一种写法:
- (instancetype)initWithName:(nonnull NSString *)name;
- (instancetype)initWithName:(nullable NSString *)name;
第二种写法:
- (instancetype)initWithName:(_Nonnull NSString *)name;
- (instancetype)initWithName:(_Nullable NSString *)name;
当然,试想一下如果每一个参数都需要指定 _nullable 或者 _nonnull,未免不是太麻烦了么!好在苹果给我们提供了一对宏定义: NS_ASSUME_NONNULL_BEGIN
和 NS_ASSUME_NONNULL_END
基本用法如下:
NS_ASSUME_NONNULL_BEGIN
@interface DemoVC_1 : UIViewController
//需要指定 nullable
@property (nonatomic, copy, nullable) NSString *name;
//NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END 之间,此处 ID 没有指定则默认为 nonnull
- (instancetype)initWithID:(NSString *)ID;
@end
NS_ASSUME_NONNULL_END
总结
其实很早以前就看见别人用这两个小玩意了,因为懒就没去仔细研究,导致一直没弄明白,今天又看见了,一脸尴尬。。优秀的开发者总是时刻追随技术最前沿,拥抱变化,接收新鲜事物,希望自己在以后的开发中能够亲身践行,加油!
博主原创,转载请注明出处,不胜感激