Странное 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