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

时间:2017-01-12 09:37:25

标签: swift generics equality

我目前正在尝试使用像LinkedList这样的基本数据结构。我定义了一个泛型值的ListNode类,如下所示:

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
}

然后它给我的错误说&#39; ==&#39;不能应用于T和T类型。然后,我查看了语言指南并将ListNode类和LinkedList结构更改为:

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

但是它不起作用,所以我添加了“Equatable”#39; 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并不能解决我的疑虑。提前谢谢!

1 个答案:

答案 0 :(得分:1)

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

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