如果 Objective-C 编译器认为您可能要传递nil给标有 的参数,它实际上会警告您_Nonnull吗?
或者它只是暗示任何工具在 Swift 和 Objective-C 之间转换以更好地处理 Swift 选项?
我正在努力向头文件的一部分添加一些可空性注释,并且我希望块假定为非空,但之后几乎每个方法都发出警告,说我需要添加可空性注释。
下面的示例代码:
NS_ASSUME_NONNULL_BEGIN
- (void)testMethodWithParameter:(NSString *)par otherParameter:(NSString *)otherPar;
NS_ASSUME_NONNULL_END
- (void)methodThatShouldntNeedAnnotationWithText:(NSString *)txt;
//Warning: Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
Run Code Online (Sandbox Code Playgroud)
我是否错误地理解了这些宏?我认为它会包含据说在 BEGIN/END 块内审计的部分,但外面的一切仍然是_Null_unspecified
这是按预期工作的,还是我必须做些什么才能按照我的想法进行工作?
在Apple关于可空性的博客中,他们提到了这一点:
"...在Swift中,可选和非可选引用之间存在很大的区别,例如NSView与NSView?,而Objective-C将这两种类型都表示为NSView*.因为Swift编译器无法确定是否存在特别是NSView*是否可选,该类型作为一个隐式解包的可选NSView进入Swift!"
这是否意味着之前在声明Objective-C方法为在Swift中隐式解包可选的方法时,它实际上可能会崩溃(因为使用隐式解包的可选项声明的某些方法可能会返回nil)?或者,Apple是否确保只有那些绝对不返回nil的Objective-C方法被声明为隐式解包的可选项?
我已经激活了新的编译器警告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但它没有帮助.