【问题标题】:Marking plain -init to have a nullable return type without a warning将普通 -init 标记为具有可为空的返回类型而没有警告
【发布时间】:2018-05-12 02:37:23
【问题描述】:

我有一个继承自 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”与现有说明符“非空”冲突

指向NSObject的声明。

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

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

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

【问题讨论】:

  • 也许您可以扩展NSProxy 而不是NSObject。我想会有更多工作要做,但这可能是一种选择。
  • 这是一个有趣的想法,谢谢。 “代理”在语义上当然有一定的意义。
  • 这是单身人士吗?
  • 不是,@Willeke。

标签: objective-c compiler-warnings return-type objective-c-nullability


【解决方案1】:

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

@interface BasketWrapper : NSObject

+ (nullable instancetype)basketWrapper;

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

@end

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2013-03-22
    相关资源
    最近更新 更多