【问题标题】:Swift 4 Linked List Generic Types: Cannot compare two generic valuesSwift 4 Linked List Generic Types:无法比较两个泛型值
【发布时间】:2019-01-19 10:57:26
【问题描述】:

我正在尝试使用泛型类型在 Swift 游乐场中实现一个链表。我的 remove 函数在与泛型类型进行比较时给了我错误,即使它们是等价的。

我已经尝试在我的函数声明中遵守 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&lt;T&gt;' to type 'Node&lt;T&gt;?'

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

有什么想法吗?听起来我在遵守协议时可能遗漏了一个简单的步骤,但我不确定遗漏了什么……提前致谢!

【问题讨论】:

    标签: swift


    【解决方案1】:

    Equatable 一致性也应该添加到泛型类本身,不仅仅是函数,像这样:

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

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

    【讨论】:

    • 太棒了!感谢您的快速响应和您的时间!我更新了类并将其他功能与 Equatable 保持一致。但是,在声明列表的头部时,我现在在 Linked List 类中遇到了最后一个错误。我声明它var head:Node&lt;T&gt;? 并收到错误Type 'T' does not conform to protocol 'Equatable'。如果我使 LinkedList 泛型类符合 Equatable,我会收到与以前相同的错误...
    猜你喜欢
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多