0

我们正在准备一堆或 ObjC 代码供 Swift 使用,这当然需要可空性注释。现在我的理解是,那些可空性注释只需要在声明站点上,而不是在定义上。这意味着对于声明在头文件中并且定义在 am/mm 文件中的情况,您不需要将它们添加到后者。

例如...

富.h:

- (nullable Foo *)getFooWithKey:(NSString *_Nonnull)key;

富.mm:

- (Foo *)subtree:(NSString *)key
{
  // Some implementation here...
}

现在我的一些对 ObjC 有更多经验的同事说他们必须在这两个地方都去,这意味着 mm 文件实际上必须是这个......

富.mm:

- (nullable Foo *)subtree:(NSString *_Nonnull)key
{
  // Some implementation here...
}

当我问为什么时,他们说他们“匹配”。但是,当我们从 m/mm 文件中删除它们时,它们似乎仍然可以在没有它们的情况下在 Swift 中导入,因为 Swift 只查看标题。

也就是说,我不确定是否还有其他需要考虑的事情在我们没有测试的两个地方都需要它们,所以我不能说这是确定的,只有我们的测试有效。

可读性与生产力

现在通常,即使后者实际上没有做任何事情,如果它有助于提高可读性,那足以说“把它放在两个地方”。但是,在我们的特殊情况下,我们可能有数以万计的 API需要更新,因此消除那么多额外的工作对每个人来说都是一个巨大的胜利。另外,它也使编写代码模块变得更容易。

我在Apple 的文档中找到的最接近的内容是这两个摘录(重点是我的)......

但是,在常见的情况下,有一种更好的方式来编写这些注释:在方法声明中,只要类型是简单对象或块指针,就可以使用非下划线形式nullable并紧跟在左括号之后。nonnull

不带下划线的形式比带下划线的形式更好,但您仍然需要将它们应用于header 中的每种类型。为了使这项工作更容易并使您的标题更清晰,您将需要使用审核区域。

虽然它不是确定的。第一个可能将其称为“特定于声明”的“更好的方式”,但它并没有说注释通常只去那里。后者也说非下划线的可以在标题中使用,但同样,并没有说可空性注释通常只能出现在标题中,只有审计区域才会出现。

也就是说,有没有人知道苹果会在哪里澄清这一点,或者是否可以共享任何其他内容让我们知道在定义/实现中跳过它们是可以的?

4

1 回答 1

1

只有声明需要注释。对于方法,这意味着带有接口的头文件。

于 2021-03-31T20:50:10.913 回答