在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中,在这种情况下这很好。请注意,不能同时使用nonnull
和weak
。
所以你可以做:
@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_resettable
或null_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
时出错。