无法检查类型 T 的值是否相等:泛型内部可等同

Can not check equality of values of type T: Equatable inside a generic

我目前正在尝试一些基本的数据结构,例如 LinkedList。我定义了泛型值的 ListNode class,如下所示:

class ListNode<T> {
    var nodeContent: T
    var nextNode: ListNode<T>? = nil
    init() {
    // details omitted here
    }

然后是链表。我想实现 contains() 方法,所以我有这样的东西:

func contains<T>(_ item: T) -> Bool {
    var currNode = self.head
    while (currNode != nil) {
        if currNode?.nodeContent == item {
            return true
        }
        currNode = currNode?.nextNode
    }
    return false
}

然后它给我错误提示“==”不能应用于 T 和 T 类型。然后我查看了语言指南并将 ListNode class 和 LinkedList 结构更改为:

class ListNode<T: Equatable>{}
struct LinkedList<T: Equatable>{}

但它不起作用,所以我将 'Equatable' 添加到 func 本身:

func contains<T: Equatable>(_ item: T) -> Bool

还是失败了。我尝试从里面的语言指南中粘贴示例函数,

func findIndex<T: Equatable>(of valueToFind: T, in array:[T]) -> Int? {
    for (index, value) in array.enumerated() {
        if value == valueToFind {
            return index
        }
    }
    return nil
}

没有错误发生。我可以知道为什么会这样吗?我尝试搜索,但所有建议的答案如 this 都不能消除我的疑虑。提前致谢!

您只是不需要使 contains 方法通用(两次)。它在您已经通用的 class 中并且知道 T 类型。在类型声明中要求T: Equatable是正确的。

findIndex(of:in:) 按原样工作,因为它不是一个方法,而是一个独立的通用函数。