The null_resettable annotation null_resettable 修饰符

之前我们已经学了nullable 和 nonnull 这两个修饰符,现在我再介绍一个修饰符,它叫做 null_resettable。我没有重点介绍它,因为空特性修饰符本身就不常用,而 null_resettable 则更不常用。但是以后你可能会接手各种各样的项目,所以还是有必要了解它的。

有部分属性的默认值被设置为 nil 的时候,依然是有意义的。最好的例子就是 iOS 的 tintColor。你可以用 tintColor 把一个按钮设置为红色,接着把它的值设置为 nil, 这个设定并不是意味着按钮就没有颜色了,而是说让按钮变为系统默认的天蓝色。这也就是说明,当你读取 tintColor 数据的时候,永远会返回值,如果是 nil 就返回默认值。

在 Objective-C 里面,这种情况就可以由 null_resettable 修饰符操作。当你把它用在一个属性上的时候,它做了两件事情:首先它让这个值变成一个「可选值」,就和我们在 Swift 里认识的可选值概念一样。然后解包,因为 Xcode 并不知道这个属性的默认值是什么。

用 null_resettable 修饰符你要自定义 getter 访问器,setter 访问器可以像之前那样工作,但是 getter 访问器就需要一个默认值,如果传进来 nil 了,就要用到这个默认值。

具体来看代码,我们先在 Person.h 文件里这样做修改:

@property (null_resettable) NSString *name;

接着修改 Person.m 文件:

@synthesize name = _name;
- (NSString *)name {
    if (_name == nil) {
        return @"Anonymous";
    } else {
        return _name;
    }
}
- (void)setName:(NSString *)name {
    _name = name;
}

使用这种方法就可以设定 name 的默认值,无论它是否为空,就都有返回值了。

results matching ""

    No results matching ""