当前位置: 首页 > 面试题库 >

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

唐腾
2023-03-14
问题内容

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

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

这可能吗?

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


问题答案:

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

您正在寻找的是

  • SE-0143条件符合

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

从那个建议。



 类似资料:
  • 问题内容: 是否可以为特殊/构造的泛型类型扩展泛型类?我想使用一种方法来扩展Int Arrays,以计算其元素的总和。 例如 问题答案: Swift 5.x:

  • 如何使类示例推断类型基于实例值检查: 打字沙盒。

  • 问题内容: 我正在使用Swift 4并尝试解析一些JSON数据,这些数据显然在某些情况下对于同一键可能具有不同的类型值,例如: 和 我实际上坚持定义我的名字,因为我不知道如何处理这种情况,因为 抛出,自然, 相应地抛出。 定义我时如何处理这种(和类似的)情况? 问题答案: 尝试对Reddit列表JSON响应上的“已编辑”字段进行解码/编码时遇到了相同的问题。我创建了一个结构,该结构表示给定键可能存

  • 6.3. 通过嵌入结构体来扩展类型 来看看ColoredPoint这个类型: gopl.io/ch6/coloredpoint import "image/color" type Point struct{ X, Y float64 } type ColoredPoint struct { Point Color color.RGBA } 我们完全可以将ColoredPoin

  • 问题内容: 我想为此创建一个扩展名,仅影响… 我了解这些说明是相关的,但不确定如何: 扩展通用类型时,不提供类型参数列表作为扩展定义的一部分。而是在扩展程序的正文中提供原始类型定义的类型参数列表,并且原始类型参数名称用于引用原始定义的类型参数。 基本上,我正在尝试使用此方法: 在没有参数的情况下采取行动…这可能吗? 问题答案: Swift 3.1更新 从Swift 3.1(Xcode 8.3 be

  • 问题内容: 我有一个用swift编写的CustomViewController类和用Objective C编写的CustomNavigationController类。我试图将CustomNavigationController作为属性添加到我的CustomViewController中。我已经添加到我的桥接头中。 在我的CustomViewController中,我有: 在尝试构建并运行之前没有