我想知道这种函数定义是否可以在swift
中使用我们说我们有这3个协议
protocol Foo {
typealias T
func get(key: String) -> T
}
protocol Bar {
typealias T: Cacheable
func set(item: T)
}
protocol Cacheable: NSCoding {
func getKey() -> String
}
然后这两个班级
class MyClass<T: Cacheable>: Foo, Bar { ... }
class MyOtherClass<T: Cacheable>: Foo, Bar { ... }
想象一下,我们想要一个可以接收其中任何一个类的实例的函数。我无法弄清楚如何使签名正确,我已经尝试了这似乎合乎逻辑但它不起作用
func doThing<T<V> : protocol<Foo, Bar> where V:Cacheable>(instance: T) { ... }
有任何线索吗?
谢谢!
答案 0 :(得分:2)
您希望根据其关联类型对占位符设置约束:
func doThing
<U: protocol<Foo, Bar> where U.T: Cacheable>
(instance: U) {
// ...
}
(你也可能想避免给关联类型命名T
- 这最好留给占位符 - 理论上你可以写T where T.T: Cacheable
但它可能会在某些时候引起一些可怕的混乱如果这是一个容器,则约定为Element
)