Swift 4链表通用类型:无法比较两个通用值

时间:2019-01-19 10:57:26

标签: swift

我正在尝试使用通用类型在Swift游乐场中实现链接列表。我的删除功能给我有关与泛型类型进行比较的错误,即使它们是等效的。

我已经在函数声明中尝试符合Equatable和Comparable协议,但是错误仍然存​​在。

class Node<T> {

    var value:T
    var next:Node?

    init(value:T) {
        self.value = value
        self.next = nil
    }

}

func remove<T: Equatable>(value:T) -> Node<T>? {
    if isEmpty {
        return nil

    }
    else {
        var current = head!
        var prev:Node<T>? = nil

        while (current.value != value && current.next != nil) {
            prev = current
            current = current.next!
        }

        if (current.value == value) {
            //Found node. Remove by updating links, return node
            if let prev = prev {
                prev.next = current.next
                current.next = nil
            }
            else {
                self.head = current.next
                current.next = nil
            }

            size -= 1
            return current
        }
        else {
            return nil
        }
    }
}

在我的删除功能的这一行:

while (current.value != value && current.next != nil) {

我收到错误:

Binary operator '!=' cannot be applied to operands of type 'T' and 'T'

此外,当我遵循Equatable时,尝试更新前一个节点时,也会在下一行收到此错误:

Cannot assign value of type 'Node<T>' to type 'Node<T>?'

当我删除Equatable协议时,此错误将消失。

有什么想法吗?听起来好像我在遵循协议时可能会错过一个简单的步骤,但是我不确定会丢失什么……在此先感谢!

1 个答案:

答案 0 :(得分:2)

Equatable一致性也应添加到泛型类本身,而不仅仅是功能,如下所示:

class Node<T: Equatable > {
    // Your code here.
}

通过说current.value != value,您正在尝试将current.valuevalue进行比较。此时,编译器确定value符合Equatable,但不确定current.value是否符合。