3

我有一个继承自它的 ObjC 类,NSObject它包装了一些第三方库宏,以便我可以在 Swift 中使用它们的功能。该类有一个 ivar,它是库中的容器类型。容器的创建可能会失败,如果确实如此,我的类的实例化也应该失败。所以我标记-initnullable

@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”与现有说明符“非空”冲突

指着NSObject的声明。

作为一种解决方法,我用编译指示将警告标记为忽略,并且该方法在 Swift 中显示为失败。

我考虑的另一个选择是标记普通-init不可用并创建一个类方法+empty,来代替。但这很烦人,因为 a) 我不能使用 Swift 初始化语法,并且 b)init在类自己的实现中也不可用。

有没有办法在init没有警告的情况下覆盖继承的可空性?

4

1 回答 1

0

你可以声明一个与类型同名的工厂方法:

@interface BasketWrapper : NSObject

+ (nullable instancetype)basketWrapper;

/**
 * @abstract  Create an empty basket
 */
- (instancetype)init NS_UNAVAILABLE;

@end

这将使警告消失并允许您使用可失败的初始化程序。

于 2018-03-02T21:34:23.320 回答