对于已具有默认值的属性,请使用nullable / nonnull

时间:2016-10-11 03:38:22

标签: ios objective-c

我知道使用nonnullnullable的方式是

nonnull: the value won’t be nil; bridges to a regular reference.
nullable: the value can be nil; bridges to an optional.

但就我而言,titleColor似乎同时为nullablenonnull。它是nullable,因为我们可能不需要设置值nonnull,因为它始终具有默认值。我是否理解正确,在我的情况下,我应该选择哪个可空或非空?

// IN .h file 
@property(nonatomic, strong) UIColor *titleColor;
// @property(nonatomic, strong, nullable) UIColor *titleColor;


// IN .m file
-(UIColor *)titleColor{
    if(!_titleColor){
        _titleColor = [UIColor greenColor];
    }
    return _titleColor;
}

2 个答案:

答案 0 :(得分:4)

如果设置者不接受nonnull并且获取者不会返回nil,请使用nil

如果设置者接受nullable或者获取者将返回nil,请使用nil

请记住,Objective-C并不真正关心你的实际行动。

因此,如果在Swift中您使用可选项,则将其设为nullable,否则将其设为nonnull

答案 1 :(得分:0)

使用可空

null_unspecified :桥接到Swift隐式解包的可选项。这是默认值。

nonnull:该值不会为零;桥接到常规参考。

可以为空:值可以为零;桥接到可选。

null_resettable :读取时该值永远不能为nil,但您可以将其设置为nil以重置它。仅适用于属性。

代码示例:

 // property style
@property (nonatomic, strong, null_resettable) NSString *name;

// pointer style
+ (NSArray<NSView *> * _Nullable)interestingObjectsForKey:(NSString * _Nonnull)key;

// these two are equivalent!
 @property (nonatomic, strong, nullable) NSString *identifier1;
@property (nonatomic, strong) NSString * _Nullable identifier2;

更好的描述:https://swiftunboxed.com/interop/objc-nullability-annotations/

来自http://clang.llvm.org/docs/AttributeReference.html#nullability-attributes

  

nullability(type)限定符表示给定指针类型的值是否为null(_Nullable限定符),null(_Nonnull限定符)没有定义的含义,或者null的目的是不清楚(_Null_unspecified限定符)。因为可空性限定符在类型系统中表示,所以它们比nonnull和returns_nonnull属性更通用,允许表达(例如)可空指针到非空指针数组。可空性限定符被写在它们应用的指针的右侧。

Apple swift doc:https://developer.apple.com/swift/blog/?id=25