我正在尝试使用通用类型在Swift游乐场中实现链接列表。我的删除功能给我有关与泛型类型进行比较的错误,即使它们是等效的。
我已经在函数声明中尝试符合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<T>' to type 'Node<T>?'
当我删除Equatable协议时,此错误将消失。
有什么想法吗?听起来好像我在遵循协议时可能会错过一个简单的步骤,但是我不确定会丢失什么……在此先感谢!
答案 0 :(得分:2)
Equatable
一致性也应添加到泛型类本身,而不仅仅是功能,如下所示:
class Node<T: Equatable > {
// Your code here.
}
通过说current.value != value
,您正在尝试将current.value
与value
进行比较。此时,编译器确定value
符合Equatable
,但不确定current.value
是否符合。