为什么我必须将 swift 协议中的协议和包含的可选函数都标记为 @objc?

why do I have to mark both the protocol & contained optional functions in a swift protocol as @objc?

我在协议中声明可选函数时发现了一些不一致之处。在协议中声明可选函数时,我必须将协议和可选函数都标记为 @objc。然后我查阅了 UICollectionViewDataSource 的文档,发现那里没有声明可选函数的要求。

我已经尝试确认 NSObjectProtocol 但编译器仍然要求我将协议和可选函数标记为 @objc。有人可以就此启发我吗?

如果你想在协议中做可选功能,那么你必须以这种方式声明 @objc 协议 MyOptionalProtocol { @objc 可选函数 optionalFunction()<br> }

UICollectionViewDataSource 是从 ObjC 导入的。 auto-generated Swift header 不会在每个元素上插入 @objc。这些 header 无效 Swift 是很常见的(例如,它们定义结构并且 类 没有实现,这是无效的 Swift)。

当您编写 Swift(而不是查看 auto-generated headers)时,您需要告诉编译器它需要将某些东西桥接到 ObjC,并且你用 @objc 来做到这一点。导入的 ObjC 不必桥接。