【发布时间】:2014-10-16 01:21:49
【问题描述】:
我正在寻找一种从协议类型中动态获取协议名称的方法,而不必在协议声明中使用@objc 属性。
我知道这行得通:
func keyForProtocol(aProtocol: Protocol) -> String {
return NSStringFromProtocol(aProtocol)
}
但仅当协议具有@obj 属性时:
@objc protocol Test {}
var key = keyForProtocol(Test.self) // Key contains "TestApp.Test"
但是,一旦我删除 @objc 属性,编译就会失败并出现以下错误:
'Test.Protocol' is not convertible to 'Protocol'
有什么方法可以实现吗?
注意:我想避免使用@objc 的原因是它不允许使用关联类型(即协议中的泛型)——在这种情况下编译失败并出现以下错误:@ 987654328@
【问题讨论】:
-
我不相信这是可以做到的,但我很想知道你想用它实现什么——因为不管它是什么,它可能也行不通:) .我怀疑最好只在编译时考虑 Swift 协议才真正“存在”。我很确定编译后的二进制文件中没有任何可用的协议信息(因此没有对非@objc 协议等的一致性检查)。
-
@Sam:我构建了一个简单的依赖注入框架,允许我将协议绑定到类类型。在我尝试在协议中使用泛型之前它工作得很好,因此需要摆脱
@obj属性。 -
是的,@objc 协议可以正常工作,但 Swift 协议不同,您不能在运行时对它们做太多事情。我想说你需要想出一个不同的依赖匹配设计。
标签: swift