IBOutlet属性是否应标记为可空或非空?

时间:2016-07-28 18:45:39

标签: ios objective-c xcode cocoa-touch nullable

在Objective-C中,我用于声明使用

连接到Interface Builder的属性
@property (nonatomic, weak) IBOutlet UIView *myView; 

现在我有一个使用新的XCode可空性属性的类。为了保持与Swift的兼容性,IBOutlet应具有哪些可空性属性?根据Apple" Using Swift with Cocoa and Objective-C":

  

当您在Swift中声明一个插座时,您应该使插座的类型成为隐式解包的可选项。这样,您可以让故事板在初始化后在运行时连接出口。当您从故事板或xib文件初始化类时,可以假设插座已连接。

这是否意味着应该在Objective-C中声明出口nonnull

2 个答案:

答案 0 :(得分:8)

如果您的类是用Swift编写的,则不能使用非可选属性,否则编译器会抱怨该属性从未初始化。这就是为什么Apple建议将它声明为一个隐式解包的可选项,因为一旦你的对象被初始化,你就确定该属性包含一个值(除非你有一个悬挂的插座,这可能会发生......) / p>

从Objective-C导出时,您可以将其标记为nonnull,它将作为非可选属性出现在Swift中,在这种情况下可以正常使用。请注意,您不能同时使用nonnullweak

所以你可以这样做:

@property (nonatomic, strong, nonnull) IBOutlet UIView *subview;
// Exported to Swift as @IBOutlet var subview: UIView

@property (nonatomic, weak, nullable) IBOutlet UIView *subview;
// Exported to Swift as @IBOutlet weak var subview: UIView?

如果由于某种原因您仍希望将属性作为隐式展开的可选项导出到Swift,则可以将该属性标记为null_resettablenull_unspecified。这不是他们的意思,但它仍然会产生预期的结果。有关这些注释的更多信息,请参阅this blog post

@property (nonatomic, weak, null_unspecified) IBOutlet UIView *subview;
// Exported to Swift as @IBOutlet weak var subview: UIView!

答案 1 :(得分:1)

weak的声明暗示该属性可以为空。因此,这是有效的

@property (nonatomic, weak, nullable) IBOutlet UIView *contentView;

声明属性nonnull会出错。