带有泛型参数的Swift 3泛型扩展约束

时间:2017-07-13 10:13:20

标签: swift generics

这是我想要实现的目标:

我有一个通用结构struct Future<Element> {}和另一个通用结构Response<T> {}。我想编写一个Future扩展名的方法,该方法仅在ElementResponse<T>时才有效。 T是什么并不重要。所以这是代码:

extension Future where Element == Response { }

但swift编译器抱怨引用泛型类型&#39;响应&#39;需要&lt; ...&gt; 中的参数。还有另一种方法可以在swift中实现这一目标吗?

2 个答案:

答案 0 :(得分:10)

我知道自从你提出要求以来已经有一段时间了,但我现在正试图解决类似问题......如何以这种方式编写扩展,作为具有所需约束的通用函数? / p>

struct Future<Element> {
    let elem: Element
}
struct Response<T> {
    let t: T
}

extension Future {
    func newFunc<X>() where Element == Response<X> {
        print("My Element is a Response: \(elem.t)")
    }
}

答案 1 :(得分:2)

一种可能的解决方案是创建Response符合的虚拟协议:

protocol ResponseObject {}

struct Response<T> {}
extension Response: ResponseObject {}

然后,您就可以检查扩展程序中的协议一致性:

extension Future where Element: ResponseObject {
    // ...
}