在 swift 语言中,通过 ! 和 ? 可以将对象声明成 Optional,用于在开发中标记这个对象是否可以为空。在 OC 中,以前是没有这样的功能的,因此我们在开发中会经常遇到因为某个函数应该返回实例而返回了空导致的崩溃。Nullability 的主要用武之地,就是在这里,它可以起到提示开发者做是否为空的判断的提示。这一特性在 Xcode6.3 中就已经支持,但在 Xcode7 中又做了一些写法上的小改动。
-
Xcode7 中,系统的框架中已经支持了 Nullability,如下所示,这是 NSArray 中的两个属性,其中 nullable 关键字说明了这里可能返回空的值。
@property (nullable, nonatomic, readonly) ObjectType firstObject;
@property (nullable, nonatomic, readonly) ObjectType lastObject;
-
如果仅仅是在返回值中给开发者一些提示,可能觉得应用并不大,对开发者最大的帮助是这一特性可以用于函数的参数中,这样我们在调用函数时起到的提示作用,将是非常重要的,越是多人合作的项目,作用也越大。例如以下方法中,我们在调用函数时,如果传入了空值,编译器会给我们警告。
- (void)setName:(NSString * _Nonnull)name {
}
-
修饰参数:
-
iOS9 的 SDK 中已经完全兼容使用了这些特性,并且 nonnull 的使用会比 nullable 广泛的多,系统提供了这样一对宏,我们在这对宏之间定义的变量都会加上 nonnull 的修饰符,只有我们特殊声明 nullable 的才需要手动写。
#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
#define NS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end")
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface NSData (FormData)
- (void)q_setHttpHeaderFieldWithRequest:(NSMutableURLRequest *)request fileBoundary:(nullable NSString *)fileBoundary;
@end
NS_ASSUME_NONNULL_END