objective-c - 在纯 Swift 中声明一个协议(protocol) @objc 和让它符合 NSObjectProtocol 有什么区别?

标签 objective-c swift nsobject objective-c-runtime swift-protocols

考虑两个 Swift 协议(protocol):

@objc protocol SomeProtocol { }

protocol SomeOtherProtocol: NSObjectProtocol { }

声明 Swift 协议(protocol) @objc 或使其符合 NSObjectProtocol 有什么区别?我知道任何不包含 @objc 的协议(protocol)都不会桥接到 Objective-C,但是在纯 Swift 应用程序中这两个声明有什么区别?据我了解,@objc 应该通过顶级 SwiftObject 使 SomeProtocol 符合 NSObjectProtocol

最佳答案

有差异,但可能会有些细微差别。简而言之,@objc 为您提供了您不需要且不适用于结构的可选。另一方面,NSObjectProtocol 本质上只是将实现限制为 NSObject 的子类。

将协议(protocol)注释为@objc 意味着它已注册到 Objective-C 运行时,允许协议(protocol)具有运行时特定的功能,即可选要求。这也意味着该协议(protocol)不能用在结构上,但它可以用在任何类上,同样,包含它的字典和数组可以桥接到 NSDictionary 和 NSArray。从纯 Swift 的角度来看,您可能没有理由需要这样做,因为该功能在很大程度上已被协议(protocol)扩展所取代。

另一方面,当协议(protocol)扩展 NSObjectProtocol 时,它仍然可以在结构上使用,但是该结构必须实现 所期望的所有方法>NSObjectProtocol。这可能是一项艰巨的任务。从实际的角度来看,它实际上只是迫使您使实现 SomeOtherProtocol 的类成为链上某处的 NSObject 的子类。

关于objective-c - 在纯 Swift 中声明一个协议(protocol) @objc 和让它符合 NSObjectProtocol 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37443212/

相关文章:

objective-c - 内存泄漏警告我无法解决

ios - ReactiveCocoa 问题

function - 从 subview SWIFT 启动父方法

ios - UIViewController 中的 textLabel.text 在从 NSObject 分配字符串时出现 nil

objective-c - 基于 NSObject 的类的 iOS JSON 序列化

ios - 在 nsobject 和 View Controller 之间传递数据的最佳方式

objective-c - 开发版本和 adhoc/release 之间有任何#define 或类似的区别吗?

objective-c - 自定义 NSWindow 内容边距会导致自动调整大小蒙版困惑

ios - 无法接收变更通知、键值观察、KVO模型-IOS

ios - 在 Swift 中填充多维数组