无法检查类型 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:)
按原样工作,因为它不是一个方法,而是一个独立的通用函数。
我目前正在尝试一些基本的数据结构,例如 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:)
按原样工作,因为它不是一个方法,而是一个独立的通用函数。