IBOutlet属性是否应标记为null或nonnull



在Objective-C中,我习惯于使用声明连接到接口生成器的属性

@property (nonatomic, weak) IBOutlet UIView *myView; 

现在,我有了一个使用新XCode nullability属性的类。为了保持与Swift的兼容性,IBOutlet应该具有什么null属性?根据苹果公司的"使用Swift与Cocoa和Objective-C":

当您在Swift中声明出口时,您应该将出口的类型设置为隐式展开的可选类型。通过这种方式,您可以让故事板在初始化后的运行时连接出口。当您的类从情节提要或xib文件初始化时,您可以假设出口已经连接。

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

如果您的类是用Swift编写的,则不能使用非可选属性,否则编译器将抱怨该属性从未初始化。这就是为什么苹果建议将其声明为隐式展开的可选项,因为一旦您的对象被初始化,您就可以确定该属性包含一个值(除非您有一个悬空的出口,顺便说一句,这可能会发生…)

从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。这并不是它们真正的目的,但它仍然会产生预期的结果。有关这些注释的详细信息,请参阅此博客文章。

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

weak的声明意味着该属性可以为null。因此,这适用于

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

声明属性nonnull时出错。

最新更新