@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的区别