私はそうのようなバイナリツリーのNode
クラスを持っている:ジェネリック関数内スウィフトEquatableジェネリック型の比較
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
がnode
上T
と同じタイプであることを考えていない理由を知っていないようだか分かりません。
コード:予想通り
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
私は同じエラーにアレクサンダーへ
Comparable'。 – Alexander
私は 'Equatable'と' Comparable'を混同していると本当に馬鹿げていると感じます。ありがとうございました! – richy
実際に必要なのは 'Comparable'プロトコルです。 'Equatable'プロトコルは、適合のために等価(' == ')関数の実装だけを必要とします。比較関数( '<'など)は 'Comparable'プロトコルによってのみ実装されることが保証されています。 –