我目前正在尝试使用像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并不能解决我的疑虑。提前谢谢!
答案 0 :(得分:1)
您不需要将contains
方法设为通用(两次)。它已经在您已经通用的类中,并且知道T
类型。在类型声明中要求T: Equatable
是正确的。
findIndex(of:in:)
按原样运行,因为它不是一种方法,而是一种独立的通用函数。