具有泛型的嵌套类型约束

时间:2015-04-14 11:21:00

标签: swift generics

我想知道这种函数定义是否可以在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) { ... }

有任何线索吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您希望根据其关联类型对占位符设置约束:

func doThing
  <U: protocol<Foo, Bar> where U.T: Cacheable>
  (instance: U) {
    // ...
}

(你也可能想避免给关联类型命名T - 这最好留给占位符 - 理论上你可以写T where T.T: Cacheable但它可能会在某些时候引起一些可怕的混乱如果这是一个容器,则约定为Element