4

我已经激活了新的编译器警告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了,但没有帮助。

4

1 回答 1

6

第一的:

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

包裹在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);

第二

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

这个函数返回一个可以为空的 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 博客文章:https ://developer.apple.com/swift/blog/?id=25

于 2015-11-13T12:23:26.587 回答