一尘不染

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

swift

如果我有一个通用的结构像…

struct Blah<T> {
    let someProperty: T
}

然后我可以扩展BlahEquatable仅当Tis 时才符合Equatable。喜欢…

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

这可能吗?

我尝试了几种不同的编码方式,但是每种方式都给我一个略有不同的错误。


阅读 185

收藏
2020-07-07

共1个答案

一尘不染

更新: 条件一致性已在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的要求进行编译和工作。


您正在寻找的是

(这又是“泛型宣言”的一部分)。该提案已被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
  }
}

从那个建议。

2020-07-07