內斯威夫特Equatable泛型類型的比較,我有一個Node
類二叉樹,像這樣:泛型函數
class Node<T: Equatable> {
let value: T
let left: Node<T>?
let right: Node<T>?
init(value: T, left: Node<T>? = nil, right: Node<T>? = nil) {
self.value = value
self.left = left
self.right = right
}
}
的值需要equatable。
我可以測試出公平性這樣的:
let a = Node(value: 8)
let b = Node(value: 7)
let c = a.value > b.value
的正常工作,c: true
但是,當我寫的使用,我得到了節點的公平性的通用功能的錯誤:
func isBinaryTree<T>(node: Node<T>) -> Bool {
if let leftNode = node.left {
guard leftNode.value < node.value else {
return false
}
guard isBinaryTree(node: leftNode) else {
return false
}
}
if let rightNode = node.right {
guard rightNode.value >= node.value else {
return false
}
guard isBinaryTree(node: rightNode) else {
return false
}
}
return true
}
let result = isBinaryTree(node: root)
錯誤:
error: binary operator '<' cannot be applied to two 'T' operands guard leftNode.value < node.value ||`
我不知道爲什麼編譯器似乎不知道爲什麼T
值Equatable
或爲什麼它不認爲在leftNode
的T
是相同類型T
上node
。
的代碼:如預期
let d = Node(value: Float(3), left: Node(value: Int(8)) , right: nil)
給出了一個錯誤。
進一步展望這一點,因爲當我嘗試它的代碼是不相關的功能:
let x = Node(value: 3, left: Node(value: 8) , right: nil)
let y = x.value < x.left!.value
我得到同樣的錯誤
你的榜樣'C'可以是不可能的,因爲你的'Node' ISN '可比'。 – Alexander
混淆了我的'Equatable'和'Comparable'我覺得很愚蠢。謝謝! – richy
你實際需要的是「Comparable」協議。 「Equatable」協議只需要執行等式('==')函數來實現一致性。比較函數(如'<')只能保證由「Comparable」協議實現。 –