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

时间:2016-02-25 02:30:18

标签: swift generics equatable

我正致力于在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有效负载兼容进行比较 - 不需要它们。

思考?谢谢!

1 个答案:

答案 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