我正致力于在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必须绑定到一个等于的类类型。我遇到的问题是包含此元素的Node。 Node将用于Dictionary,Array或任何其他容器类型。这就是我所拥有的:
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有效负载兼容进行比较 - 不需要它们。
思考?谢谢!
答案 0 :(得分:1)
为了将payload
限制为Equatable
类型,您需要Node
作为通用类,以便它可以传递该约束。
您可以在类声明中指定约束:
public class Node<T: Equatable>: Equatable {...}
然后在声明有效负载时,您可以将其Element类型设置为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