我正在尝试将 Swift 协议(protocol)与实现动态匹配,但我在尝试在运行时执行协议(protocol)比较时遇到了阻碍 - 似乎协议(protocol)在运行时可能并不存在?
我尝试过的一些例子:
var protocols[Any]
func findProtocol(aProtocol: Any) -> Bool {
// Nope, protocols don't implement equatable
aProtocol == protocols[0]
// Doesn't work, unsafeAddressOf() only applies to AnyObjects
let pointer: UnsafePointer = unsafeAddressOf(aProtocol)
}
我想我可能已经触及了试图打败类型系统的界限……有什么想法吗?
最佳答案
如果您知道比较类型本身,您应该使用更合适的类型 (Any.Type
):
var protocolArray: [Any.Type] = [...]
func findProtocol(aProtocol: Any.Type) -> Bool {
// you can do that because Any.Type has an == operator
return protocolArray.contains{ $0 == aProtocol }
}
对于 Any
类型,你必须转换它:
var protocolArray: [Any] = [...]
func findProtocol(aProtocol: Any) -> Bool {
return protocolArray.contains{
if let p1 = $0 as? Any.Type, p2 = aProtocol as? Any.Type {
return p1 == p2
}
return false
}
}
关于swift - Swift 协议(protocol)元类型的运行时比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31976567/