奇怪的 CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION 警告
Strange CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION warning
我已经激活了新的编译器警告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__]
我收到以下错误:
Implicit conversion from nullable pointer 'NSString * _Nullable' to
non-nullable pointer type 'NSString * _Nonnull'
知道如何重写宏吗?
我已经尝试过 __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS/__PRAGMA_POP_NO_EXTRA_ARG_WARNINGS
但没有用。
第一个:
- (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);
这个函数returns一个可为空的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__]
如果您想了解 Obj-C 和 Swift 中的可空性,请阅读此 Apple 博客 post 关于此事:https://developer.apple.com/swift/blog/?id=25
我已经激活了新的编译器警告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__]
我收到以下错误:
Implicit conversion from nullable pointer 'NSString * _Nullable' to non-nullable pointer type 'NSString * _Nonnull'
知道如何重写宏吗?
我已经尝试过 __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS/__PRAGMA_POP_NO_EXTRA_ARG_WARNINGS
但没有用。
第一个:
- (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);
这个函数returns一个可为空的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__]
如果您想了解 Obj-C 和 Swift 中的可空性,请阅读此 Apple 博客 post 关于此事:https://developer.apple.com/swift/blog/?id=25