Странное CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION предупреждение

Я активировал новое предупреждение компилятора CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION, Я мог бы разрешить большинство предупреждений, но одно из них связано с макросом, и я не уверен, как решить проблему.

Макрос выглядит так:

#define MYAssertionFail(...) [[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSUTF8StringEncoding] file:[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lineNumber:__LINE__ description:__VA_ARGS__]

Я получаю следующую ошибку:

Неявное преобразование из обнуляемого указателя 'NSString * _Nullable' в необнуляемый указатель типа 'NSString * _Nonnull'

Есть идеи, как переписать макрос?

Я уже пробовала __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS/__PRAGMA_POP_NO_EXTRA_ARG_WARNINGS но это не помогло.

1 ответ

Решение

Первый:

- (void)handleFailureInFunction:(NSString *)functionName file:(NSString *)fileName lineNumber:(NSInteger)line description:(nullable NSString *)format,... NS_FORMAT_FUNCTION(4,5);

завернут в NS_ASSUME_NONNULL_BEGIN а также NS_ASSUME_NONNULL_END

Это означает, что компилятор разрешает объявление этой функции следующим образом:

- (void)handleFailureInFunction:(NSString * _Nonnull)functionName file:(NSString * _Nonnull)fileName lineNumber:(NSInteger)line description:(nullable NSString *)format,... NS_FORMAT_FUNCTION(4,5);

второй

+ (nullable id)stringWithCString:(const char *)bytes NS_DEPRECATED(10_0, 10_4, 2_0, 2_0);

Эта функция возвращает обнуляемый идентификатор, в переводе это NSString * _Nullable

Заключить

Этого должно быть достаточно, чтобы добавить приведение к вашему вызову функции следующим образом:

#define MYAssertionFail(...) [[NSAssertionHandler currentHandler] handleFailureInFunction:(NSString * _Nonnull)[NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSUTF8StringEncoding] file:(NSString * _Nonnull)[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lineNumber:__LINE__ description:__VA_ARGS__]

Если вы хотите прочитать об обнуляемости в Obj-C и Swift, прочитайте эту статью в блоге Apple по этому вопросу: https://developer.apple.com/swift/blog/?id=25

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