【问题标题】:Swift extension on generic struct based on properties of type T基于类型 T 属性的泛型结构的 Swift 扩展
【发布时间】:2017-11-18 22:26:57
【问题描述】:

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

struct Blah<T> {
    let someProperty: T
}

只有当TEquatable 时,我才能扩展Blah 以符合Equatable。喜欢...

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

这可能吗?

我尝试了几种不同的编码方式,但每种方式都会给我带来稍微不同的错误。

【问题讨论】:

标签: swift generics


【解决方案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 中按预期编译和工作。


你要找的是

(这又是"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
  }
}

来自该提案。

【讨论】:

  • 是的,我看到我几乎完全复制了提议的更改示例:D 感谢您的提醒
  • @Fogmeister:条件一致性已在 Swift 4.1 中实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
相关资源
最近更新 更多