在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
答案 0 :(得分:8)
如果您的类是用Swift编写的,则不能使用非可选属性,否则编译器会抱怨该属性从未初始化。这就是为什么Apple建议将它声明为一个隐式解包的可选项,因为一旦你的对象被初始化,你就确定该属性包含一个值(除非你有一个悬挂的插座,这可能会发生......) / p>
从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
。这不是他们的意思,但它仍然会产生预期的结果。有关这些注释的更多信息,请参阅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
会出错。