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

时间:2017-06-16 08:16:28

标签: swift generics

如果我有一个类似的通用结构......

struct Blah<T> {
    let someProperty: T
}

我可以在BlahEquatable时将T扩展为符合Equatable。像...

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

这可能吗?

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

1 个答案:

答案 0 :(得分:11)

更新:在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
    }
}

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

您正在寻找的是

(反过来又是"Generics Manifesto"的一部分)。 该提案已被Swift 4接受,但尚未实施。 从提案:

  

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

,一个突出的例子是

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

使等可等元素的数组相等,这是不可能的 现在。你的例子基本上是

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
  }
}

来自该提案。