【问题标题】:Nullability annotation warnings after NS_ASSUME_NONNULL_ENDNS_ASSUME_NONNULL_END 之后的可空性注释警告
【发布时间】:2017-01-16 19:49:11
【问题描述】:

我正在努力为头文件的一部分添加一些可空性注释,并且我希望该块假定为非空,但之后几乎所有方法都发出警告说我需要添加可空性注释。

下面的示例代码:

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)

我是否错误地理解了这些宏?我以为它会包含据说在 BEGIN/END 块内被审计的部分,但外面的一切仍然是 _Null_unspecified

这是按预期工作吗,还是我必须做些什么才能使这项工作按我的想法进行?

【问题讨论】:

  • 我不知道这是不是故意的,但我也观察到了。只要您在接口文件中有 any 可空性注释,就必须在该文件中定义可空性 everywhere
  • 至少从我对其工作原理的印象来看,NS_ASSUME_NONNULL_END 似乎在界面中没有做任何事情。 Apple Swift 博客的示例代码显示了@interface 之前的BEGIN@end 之后的END(用于接口)。也许它并不意味着只用于接口的一部分。

标签: ios objective-c swift xcode objective-c-nullability


【解决方案1】:

NS_ASSUME_NONNULL_BEGIN 将任何参数假定为非空变量,因此:

NS_ASSUME_NONNULL_BEGIN
- (void)testMethodWithParameter:(NSString *)par otherParameter:(NSString *)otherPar;
NS_ASSUME_NONNULL_END

转换为:

- (void)testMethodWithParameter:(nonnull NSString *)par otherParameter:(nonnull NSString *)otherPar;

所以,没有NS_ASSUME_NONNULL_BEGIN 并不意味着每个参数都假定为nullableunspecified,您仍然需要定义它。因此,对于另一种方法,您必须指定您想要的内容,如果您想要文本可以是 nullable,然后将关键字添加到参数中,如下所示:

- (void)methodThatShouldntNeedAnnotationWithText:(nullable NSString *)txt;

【讨论】:

  • 而且,对于testMethodWithParameter,这就是我想要的,但为什么我在NS_ASSUME_NONNULL_END 宏之后收到关于methodThatShouldntNeedAnnotationWithText 的警告?
  • 我的意思是,您必须在参数上指定nullability,您可以通过使用MACRO 或在每个参数上指定它来实现。
  • MACRO 只影响..._BEGIN..._END 之间的方法签名,所以这就是编译器告诉你的,methodThatShouldnt... 缺少nullability specifiers
  • 啊,有什么方法可以告诉编译器假设标题的其余部分未经审计?
  • 我认为这是不可能的(不确定),如果你检查NSObjCRuntime.h(通过cmd+点击NS_ASSUME_NONNULL_BEGIN)你可以单独看到那个宏的定义,我不能看到类似的东西让方法未经审计
猜你喜欢
  • 2017-09-08
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 2016-02-04
  • 2023-03-04
相关资源
最近更新 更多