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

mus*_*afa 8 generics swift

这是我想要实现的目标:

我有一个通用结构struct Future<Element> {}和另一个通用结构Response<T> {}.我想写这是在扩展的方法Future是,只有当有效ElementResponse<T>.什么T是无关紧要的.所以这是代码:

extension Future where Element == Response { }

但swift编译器抱怨引用泛型类型'Response'需要<...>中的参数.还有另一种方法可以迅速实现这一目标吗?

Pet*_*r E 10

我知道你问过这已经有一段时间了,但我现在正试图解决类似的问题......如何用这种方式编写扩展,作为具有你想要的约束的通用函数?

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)")
    }
}
Run Code Online (Sandbox Code Playgroud)


xou*_*ini 3

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

protocol ResponseObject {}

struct Response<T> {}
extension Response: ResponseObject {}
Run Code Online (Sandbox Code Playgroud)

然后您将能够检查扩展中的协议一致性:

extension Future where Element: ResponseObject {
    // ...
}
Run Code Online (Sandbox Code Playgroud)