Маркировка 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
Это уберет предупреждение и позволит вам использовать неисправный инициализатор.