我定义了一个协议,其中包含一个函数,该函数返回用户可以在其协议实现中定义的关联类型。唯一的要求是关联的类型符合Comparable.
我有另一个类,它使用符合此协议的元素。我遇到的问题是,编译器抱怨我不能比较关联类型的元素,即使我在协议定义中特别将它们标记为Comparable。有人知道我哪里做错了吗?
protocol MyElement {
associatedtype T : Comparable
func getValue() -> T
}
class MyNode {
init(elements:[any MyElement]) {
// Sort the elements
let sortedElements = elements.sorted(by: { ( a:any MyElement, b:any MyElement ) -> Bool in
let aT = a.getValue()
let bT = b.getValue()
return aT < bT
})
}
}
编译器在at
binary operator '<' cannot be applied to two 'Comparable' operands
<
运算符适用于符合Comparable的单一类型的两个值,而不是仅仅指定为Comparable的两个值。协议本身不符合。
对MyElement使用any
并不影响关于可比较约束的泛型占位符T的基本事实,因为MyElement在T上是泛型的,我们必须知道您建议排序的两个不同的符合MyElement的对象将它们的T解析为彼此相同的类型-而在您编写的代码中,我们不知道这一点,因此编译器会受阻。