问题标签 [objective-c-nullability]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
31 浏览

objective-c - Objective-C 中通常用于 Swift 的可空性相关属性是否也适用于 ObjC-ObjC 调用?

阅读与可空性相关的属性以装饰您的 Objective-C 代码以供 Swift 客户端使用。这绝对是一个很棒的特性,让你的 API 在 Swift 中更加干净。

但是,我想知道的是它们是否也可以用于在纯粹的 Objective-C 世界中强制正确使用(即 Swift 根本不是图片的一部分。)

换句话说,如果您将库中公开的函数中的属性标记为nonnull但随后从 Objective-C 使用它并传递nil给它,编译器会警告您吗?

我问是因为根据苹果的这篇文章谈到这些注释,在“兼容性”部分,它特别说注释不会影响 ABI。下一行确实讨论了使用该框架的现有代码在处理它时如何获得新的警告,但我不知道它们是指 Swift 代码还是 Objective-C 代码,他们确实特别提到了 Swift 编译器。

再说一遍,这些属性会影响纯 ObjC 到 ObjC 的调用吗?

在此处输入图像描述

0 投票
1 回答
31 浏览

objective-c - 为什么其他属性需要可空性类型说明符

我正在获取使用创建照片的日期

在我的 .h 文件中。然后我得到我的视频资产的 AVMetadataItem 的值。

这很好用,但是当我将它添加到我的 .h 文件时,我的所有其余属性都会收到一条警告,指出它们缺少可空性类型说明符,即使当我没有列出此属性时它们不需要它。如何在不向 .h 文件中的每个其他属性等添加可空性说明符的情况下执行此操作?

0 投票
1 回答
27 浏览

swift - 在使用可空性注释装饰 ObjC 代码时,您是否还必须进行定义,还是只进行声明?

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

例如...

富.h:

富.mm:

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

富.mm:

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

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

可读性与生产力

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

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

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

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

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

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