protocol ProtocolA {
func someFunc() -> Any
}
protocol ProtocolB: ProtocolA {
var someVar: Any { get }
}
enum MyEnum<T: ProtocolA, U: ProtocolB> {
case A(T)
case B(U)
}
protocol DataObject {
...
}
extension DataObject where Self: ProtocolB {
func doSomething() {
let x = MyEnum.B(self)
/// Compiler error:
/// Cannot invoke 'B' with an argument list of type '(Self)'
}
}
我不明白为什么上面给了我一个错误。奇怪的是,删除两个枚举通用约束中的任何一个,使枚举具有单个约束,解决了问题......
请注意,ProtocolB 扩展了 ProtocolA。与通用约束一起使用时不支持吗?
更新
改成MyEnum
这个可以解决问题:
enum MyEnum {
typealias T = ProtocolA
typealias U = ProtocolB
case A(T)
case B(U)
}
但是,我还是不太明白为什么……