我有一个继承自NSObject
的ObjC类,它包装了一些第三方库宏,以便我可以在Swift中使用它们的功能。该类有一个ivar,它是库中的容器类型。容器的创建可能会失败,如果确实如此,我的类的实例化也会失败。所以我把-init
标记为nullable
。
@interface BasketWrapper : NSObject
/**
* @abstract Create an empty basket
*/
- (nullable instancetype)init; // ⚠️ Conflicting nullability specifier
@end
@implementation
{
LibraryBasket * _basket;
}
- (instancetype)init
{
self = [super init];
if( !self ) return nil;
// Can't really do anything without the wrapped item.
_basket = LibraryBasket_Create();
if( !_basket ) return nil;
return self;
}
不幸的是,-init
声明会产生编译器警告
返回类型上的冲突可空性说明符'_Nullable'与现有说明符'nonnull'冲突
指着NSObject
的声明。
作为一种解决方法,我已经用pragma标记了警告,并且该方法在Swift中显示为可用。
我考虑的另一个选择是标记简单的-init
不可用,并制作一个类方法,+empty
,而不是。但那令人讨厌因为a)我不能使用Swift初始化器语法,而b)init
在类自己的实现中也是不可用的。
有没有办法在没有警告的情况下覆盖继承的init
的可空性?
您可以声明与类型具有相同名称的工厂方法:
@interface BasketWrapper : NSObject
+ (nullable instancetype)basketWrapper;
/**
* @abstract Create an empty basket
*/
- (instancetype)init NS_UNAVAILABLE;
@end
这将使警告消失,并允许您使用可用的初始化程序。