基于类型T属性的泛型结构的Swift扩展

Fog*_*ter 8 generics swift

如果我有一个像...那样的通用结构

struct Blah<T> {
    let someProperty: T
}
Run Code Online (Sandbox Code Playgroud)

然后我就可以扩展Blah到符合Equatable时才TEquatable.喜欢...

extension Blah: Equatable where T: Equatable {
    static func == (lhs: Blah, rhs: Blah) -> Bool {
        return lhs.someProperty == rhs.someProperty
    }
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?

我尝试了几种不同的编码方式,但每种方法都给我一个稍微不同的错误.

Mar*_*n R 13

更新:已在Swift 4.1和您的代码中实现了条件一致性

struct Blah<T> {
    let someProperty: T
}

extension Blah: Equatable where T: Equatable {
    static func == (lhs: Blah, rhs: Blah) -> Bool {
        return lhs.someProperty == rhs.someProperty
    }
}
Run Code Online (Sandbox Code Playgroud)

在Xcode 9.3中编译并按预期工作.


你在寻找什么

(而这又是"泛型宣言"的一部分).该提案已被Swift 4接受,但尚未实施.从提案:

条件一致性表达了一种概念,即泛型类型仅在其类型参数满足特定要求时才符合特定协议.

一个突出的例子是

extension Array: Equatable where Element: Equatable {
  static func ==(lhs: Array<Element>, rhs: Array<Element>) -> Bool { ... }
}
Run Code Online (Sandbox Code Playgroud)

使等量元素的数组相等,这在目前是不可能的.你的例子基本上就是

struct SomeWrapper<Wrapped> {
  let wrapped: Wrapped
}

extension SomeWrapper: Equatable where Wrapped: Equatable {
  static func ==(lhs: SomeWrapper<Wrapped>, rhs: SomeWrapper<Wrapper>) -> Bool {
    return lhs.wrapped == rhs.wrapped
  }
}
Run Code Online (Sandbox Code Playgroud)

从那个提议.