奇怪的CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION警告

fab*_*abb 2 clang compiler-warnings ios objective-c-nullability

我已经激活了新的编译器警告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__]
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

从可空指针'NSString*_Nullable'到非可空指针类型'NSString*_Nonnull'的隐式转换

知道如何重写宏吗?

我已经尝试__PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS/__PRAGMA_POP_NO_EXTRA_ARG_WARNINGS但它没有帮助.

Tho*_*ers 5

第一:

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

被包裹在NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END

这意味着编译器将此函数声明解析为:

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

第二

+ (nullable id)stringWithCString:(const char *)bytes NS_DEPRECATED(10_0, 10_4, 2_0, 2_0);
Run Code Online (Sandbox Code Playgroud)

这个函数返回一个可以为空的id,翻译成这个 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__]
Run Code Online (Sandbox Code Playgroud)

如果你想阅读Obj-C和Swift中的可空性,请阅读关于此事的Apple博客文章:https://developer.apple.com/swift/blog/?id = 25