作者:wyf叶子_594 | 来源:互联网 | 2023-09-06 21:54
Xcode6.3引入的一个Objective-C的新特性:nullabilityannotationsswift用!和?来区分optional和non-optionalswift和
Xcode 6.3引入的一个Objective-C的新特性:nullability annotations
swift用!和?来区分optional和non-optional
swift 和OC混编时,swift不知道OC的类型,默认non-optional
nullable: 表示修饰的属性或参数可以为空,书写方式有三种:
@property(nonatomic,strong,nullable) NSString * name;
@property(nonatomic,strong) NSString *_Nullable name;
@property(nonatomic,strong) NSString *__nullable name;
nonnull:非空,表示修饰的属性或参数不能为空,书写方式有三种:
@property(nonatomic,strong,nonnull) NSNumber * price;
@property(nonatomic,strong) NSNumber *_Nonnull price;
@property(nonatomic,strong) NSNumber *__nonnull price;
注意:nonnull,nullable只能修饰对象,不能修饰基本数据类型
在方法中使用nullable和nonnull:
- (nullable NSString *)buyBook:(nullable NSString *)book;
- (NSString *__nullable)buyBook:( NSString *__nullable)book;
- (NSString *_Nullable)buyBook:( NSString *_Nullable)book;
- (nonnull NSString *)buyBook:(nonnull NSString *)book;
- (NSString *__nonnull)buyBook:( NSString *__nonnull)book;
- (NSString *_Nonnull)buyBook:( NSString *_Nonnull)book;
Nonnull区域设置(Audited Regions)
在查看苹果iOS各种开发框架的头文件时,我们发现都是用nullable修饰的属性和方法,为什么都没看到nonnull修饰的属性和方法呢?
事实上,如果需要每个属性或每个方法的参数和返回值都去指定nonnull和nullable,是一件非常繁琐的事。苹果为了减轻我们的工作量,专门提供了两个宏:NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END。苹果用NS_ASSUME_NONNULL_BEGIN,NS_ASSUME_NONNULL_END这两个宏来统一给属性和方法参数和返回值加上nonnull修饰,NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END之间,定义的所有对象属性和方法默认都是nonnull。下图所示:
屏幕快照 2018-08-25 下午3.59.22.png
参考:
https://www.jianshu.com/p/1f672a441052