【问题标题】:Swift 2 Generic data structure not conforming to Equatable protocolSwift 2 通用数据结构不符合 Equatable 协议
【发布时间】:2016-06-07 15:03:37
【问题描述】:

我正在努力在 Swift 中构建一个名为 Node 的灵活数据结构,它本身不依赖于任何类型的内容。但是,Node 中的 Payload 数据被声明为以下符合 Equatable 协议的通用 Element 结构:

public struct Element<T>: Equatable {
  var data: T;
}

public func ==<T:Equatable>(lhs: Element<T>, rhs: Element<T>) -> Bool {
    return lhs.data == rhs.data;
}

约束是 Element 必须绑定到一个可等价的类类型。我遇到的问题是包含此元素的节点。该节点将用于字典、数组或任何其他容器类型。这是我所拥有的:

public class Node: Equatable {

    var payload: Element<AnyObject>

    init(_data: Element<AnyObject>) {
        self.payload = _data
    }

}

public func ==(lhs: Node, rhs: Node) -> Bool {
    return lhs.payload == rhs.payload;
}

当然,我收到 AnyObject 不符合 Equatable 的错误。有什么方法可以将有效负载的声明限制为仅可等同的对象?此时,我不知道payload中可能存储了什么样的对象。

还刚刚意识到我需要在 Node 中的 == 函数中进行类检查,以确保两个 Node 有效负载兼容以进行比较——不需要它们。

想法?谢谢!

【问题讨论】:

  • 您的第二个== 实现指的是lhs.datarhs.data,其中lhsrhs 是节点。但是您的 Node 类没有 data 属性,所以我不明白这应该是什么意思。你的意思是lhs.payloadrhs.payload
  • 是的。我做了一些简化,却忘了改变它。它应该是 lhs.payload 和 rhs.payload

标签: swift generics equatable


【解决方案1】:

为了将payload 约束为Equatable 的类型,您需要将Node 作为泛型类,以便它可以传递该约束。

你可以在你的类声明中指定约束:

public class Node<T: Equatable>: Equatable {...}

然后在声明您的有效负载时,您可以将其元素类型设置为 T:

var payload: Element<T>

在测试代码时,我还必须使 Element 中的通用约束 T 符合 Equatable。完整代码供参考:

public struct Element<T: Equatable>: Equatable {
    var data: T
}

public func ==<T:Equatable>(lhs: Element<T>, rhs: Element<T>) -> Bool {
    return lhs.data == rhs.data
}

public class Node<T: Equatable>: Equatable {
    var payload: Element<T>
    init(_data: Element<T>) {
        self.payload = _data
    }
}

public func ==<T: Equatable>(lhs: Node<T>, rhs: Node<T>) -> Bool {
    return lhs.payload == rhs.payload
}

这将产生以下结果:

Node(_data: Element(data: 1)) == Node(_data: Element(data: 1)) // true
Node(_data: Element(data: 1)) == Node(_data: Element(data: 2)) // false

【讨论】:

  • 太棒了!谢谢!
猜你喜欢
  • 2016-09-29
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
相关资源
最近更新 更多