@protocol(DelegateType) 的 Swift 等效项

Posted

技术标签:

【中文标题】@protocol(DelegateType) 的 Swift 等效项【英文标题】:Swift equivalent for @protocol(DelegateType) 【发布时间】:2014-07-07 17:42:04 【问题描述】:

我正在使用 Swift 中的 ReactiveCocoa。我需要使用以下方法:

rac_signalForSelector(selector: Selector, fromProtocol: Protocol?)

通过Selector("method:") 传递选择器可以正常工作,但我找不到如何将委托协议传递给fromProtocol 参数。

将协议类型从委托传递到这样的方法签名的正确方法是什么?

编辑:添加方法文档和最佳尝试

该方法的文档如下:

selector - 要观察其调用的选择器。如果它不存在,它将使用来自协议的信息来实现,并且可以接受非对象参数并返回一个值。这不能将 C 数组或联合作为参数或返回类型。

protocol - 声明选择器的协议。如果选择器尚未在接收器上实现,这将用于类型信息。这不能为NULL,并且此协议中必须存在选择器。

我已尝试发送DelegateType.self,但最终收到此错误:

找不到接受所提供参数的rac_signalForSelector 的重载

【问题讨论】:

NSProtocolFromString 会在你绝望时可用;希望有人可以提供更好的答案。 【参考方案1】:

您在声明协议时是否使用了@objc

我相信SomeProtocol.self 是传递它的正确方法,但由于您将它传递给 obj-c API,它需要以 @objc 为前缀,例如 this example from the docs:

@objc protocol HasArea 
    var area: Double  get 

编辑:原来有问题的协议来自一个库(用objective-c编写,因此已经与objective-c兼容),而不是在Swift中定义。

既然如此,它可能是一个编译器错误,所以在您执行任何其他操作之前确保您使用的是最新版本的 Xcode(在撰写本文时为 beta 3)。

如果这不起作用,我认为 Tommy 使用 NSProtocolFromString 的想法是修复编译器错误之前的最佳解决方案。

【讨论】:

协议来自第三方库(SocketRocket)。在这种情况下我有什么选择? @ShaneN 嗯......所以它已经是一个objective-c协议,因为它是在objective-c中定义的?我认为 Tommy 使用 NSProtocolFromString 的想法可能是您目前唯一的选择。你下载 Xcode6 Beta 3 了吗?也许这在那个版本中得到了解决? 是的,它已经是一个objective-c协议。我还没有升级到 Beta 3。现在正在下载。安装完成后我会再试一次并添加评论。 升级到 Beta 3 解决了这个问题(我期待 App Store 让我知道更新,哎呀) 您能否在我接受之前更新您的答案以包含您对 Beta 3 的评论?

以上是关于@protocol(DelegateType) 的 Swift 等效项的主要内容,如果未能解决你的问题,请参考以下文章

Protocol* x = @protocol(aProtocolName) 在目标 c 中做了啥?

swift中的protocol和OC中protocol的区别

objective c, protocol

iOS Protocol 详解

Protocol buffers--python 实践 protocol buffers vs json

Protocol基本概念