Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 2通用数据结构不符合Equalable协议_Swift_Generics_Equatable - Fatal编程技术网

Swift 2通用数据结构不符合Equalable协议

Swift 2通用数据结构不符合Equalable协议,swift,generics,equatable,Swift,Generics,Equatable,我正在致力于在Swift中构建一个称为节点的灵活数据结构,它本身不与任何类型的内容相关联。但是,节点内的有效负载数据声明为符合Equalable协议的以下通用元素结构: public struct Element<T>: Equatable { var data: T; } public func ==<T:Equatable>(lhs: Element<T>, rhs: Element<T>) -> Bool { return

我正在致力于在Swift中构建一个称为节点的灵活数据结构,它本身不与任何类型的内容相关联。但是,节点内的有效负载数据声明为符合Equalable协议的以下通用元素结构:

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

public func ==<T:Equatable>(lhs: Element<T>, rhs: Element<T>) -> Bool {
    return lhs.data == rhs.data;
}
public结构元素:equalable{
var数据:T;
}
公共函数==(左:元素,右:元素)->Bool{
返回lhs.data==rhs.data;
}
约束条件是元素必须绑定到一个可等式类类型。我遇到的问题是包含此元素的节点。该节点将在字典、数组或任何其他容器类型中使用。以下是我所拥有的:

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;
}
公共类节点:可均衡{
var有效载荷:元素
init(_数据:元素){
self.payload=\u数据
}
}
公共函数==(左:节点,右:节点)->Bool{
返回lhs.payload==rhs.payload;
}
当然,我得到的错误是,任何对象都不符合equalable。是否有任何方法将有效负载的声明限制为仅可相等的对象?在这一点上,我不知道什么样的对象可能存储在有效负载中

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


想法?谢谢大家!

为了将
有效负载
约束为
可均衡的类型
,您需要将
节点
作为泛型类,以便它可以传递该约束

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

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

第二个
=
实现涉及
lhs.data
rhs.data
,其中
lhs
rhs
是节点。但是您的节点类没有
数据
属性,所以我不明白这意味着什么。您是指
lhs.payload
rhs.payload
?是的。我做了一些简化,但忘了更改。它应该读为lhs.payload和rhs.payloadsome!非常感谢。
var payload: Element<T>
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