Маркировка plain -init имеет тип возвращаемого значения без предупреждения без предупреждения

У меня есть класс ObjC, наследующий от NSObject это оборачивает некоторые макросы сторонних библиотек, чтобы я мог использовать их функциональность в 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вместо. Но это раздражает, потому что а) я не могу использовать синтаксис инициатора Swift и б) init также недоступен в собственной реализации класса.

Есть ли способ переопределить обнуляемость унаследованного init без предупреждения?

1 ответ

Вы можете объявить метод фабрики, имеющий то же имя, что и тип:

@interface BasketWrapper : NSObject

+ (nullable instancetype)basketWrapper;

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

@end

Это уберет предупреждение и позволит вам использовать неисправный инициализатор.

Другие вопросы по тегам