将plain -init标记为具有可为空的返回类型而不发出警告

问题描述 投票:1回答:1

我有一个继承自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的可空性?

objective-c compiler-warnings return-type objective-c-nullability
1个回答
0
投票

您可以声明与类型具有相同名称的工厂方法:

@interface BasketWrapper : NSObject

+ (nullable instancetype)basketWrapper;

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

@end

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

© www.soinside.com 2019 - 2024. All rights reserved.