Swift 2 不符合 Equatable 协议的通用数据结构
Swift 2 Generic data structure not conforming to Equatable protocol
我正致力于在 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;
}
约束是元素必须绑定到可等式 class 类型。我遇到的问题是包含此元素的节点。节点将用于字典、数组或任何其他容器类型。这是我拥有的:
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 中的 == 函数中放置一个 class 检查以确保两个 Node 有效载荷兼容以进行比较——不需要它们是。
想法?谢谢!
为了将 payload
限制为 Equatable
类型,您需要 Node
成为通用 class 以便它可以传递约束。
您可以在 class 声明中指定约束:
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 中构建一个名为 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;
}
约束是元素必须绑定到可等式 class 类型。我遇到的问题是包含此元素的节点。节点将用于字典、数组或任何其他容器类型。这是我拥有的:
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 中的 == 函数中放置一个 class 检查以确保两个 Node 有效载荷兼容以进行比较——不需要它们是。
想法?谢谢!
为了将 payload
限制为 Equatable
类型,您需要 Node
成为通用 class 以便它可以传递约束。
您可以在 class 声明中指定约束:
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