gpt4 book ai didi

Swift 2 通用数据结构不符合 Equatable 协议(protocol)

转载 作者:行者123 更新时间:2023-11-28 06:48:18 27 4
gpt4 key购买 nike

我正致力于在 Swift 中构建一个名为 Node 的灵活数据结构,它本身不依赖于任何类型的内容。但是,Node 中的 Payload 数据被声明为以下符合 Equatable 协议(protocol)的通用 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;
}

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

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 的错误。有什么方法可以将有效负载的声明限制为仅可等同的对象吗?此时,我不知道负载中可能存储了什么样的对象。

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

想法?谢谢!

最佳答案

为了将 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

关于Swift 2 通用数据结构不符合 Equatable 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35617139/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com