Generics 协议的可哈希协议

Generics 协议的可哈希协议,generics,swift3,protocols,hashable,equatable,Generics,Swift3,Protocols,Hashable,Equatable,我想知道下面的代码有什么问题 import Foundation enum SliderType: Int { case analog = 1, discrete, highLow } protocol DataEntry: class, Hashable { var hashValue: Int { get set } // hashable protocol requires this var idx: Int { get set } var categ

我想知道下面的代码有什么问题

import Foundation

enum SliderType: Int {
    case analog = 1, discrete, highLow
}

protocol DataEntry: class, Hashable {

    var hashValue: Int { get set } // hashable protocol requires this
    var idx: Int { get set }
    var category: String { get set }
    var sliderType: SliderType { get set }
    var sliderTitle: String { get set }
    var sliderCurrentValue: Float { get set }
    var sliderMinValue: Float { get set }
    var sliderMaxValue: Float { get set }
}

func ==(lhs: DataEntry, rhs: DataEntry) -> Bool {
    return lhs.idx == rhs.idx
}
从这个屏幕截图中可以看出,我不断得到错误
协议“DataEntry”只能用作一般约束,因为它具有自身或关联的类型要求

有人知道这里可能出了什么问题吗?? 如何将哈希协议实现为协议


=
要求
lhs
rhs
为同一类型。拥有这两种类型的be
DataEntry
是不够的,因为您可以拥有
lhs
be
FooDataEntry
,以及
rhs
be
BarDataEntry

您需要使用泛型来加强
lhs
rhs
之间的这种关系

func ==<T: DataEntry>(lhs: T, rhs: T) -> Bool {
    return lhs.idx == rhs.idx
}
func==(左:T,右:T)->Bool{
返回lhs.idx==rhs.idx
}

Hmm-仍然没有帮助。我总是犯同样的错误(即,
协议“DataEntry”只能用作泛型约束,因为它具有自身或关联的类型要求
…这可能是因为我使相当多的类符合
DataEntry
协议。而且这些可能不属于可平等协议的范围-即使您有引入泛型的想法s我可能需要考虑使我创建的所有类都符合
DataEntry
…或您有其他想法吗?几乎在我使用
DataEntry
的任何地方,例如在另一个协议中:
协议平衡模型{func getEntries(u.completionHandler:@escaping(u.entries:[DataEntry])->Void)}
或类内部,例如-我在其中创建一个属性:
fileprivate var entries=[DataEntry]()
是的,这是使用带有Sef/关联类型要求的协议的结果。一旦创建了
DataEntry
就有了自类型要求(你这样做是间接的,我让它变得平等,这有一个自我类型的要求),您只能将其用作通用约束。
DataEntry
现在不仅仅是一种类型,它是一种不完整的类型。它可以具有的每个可能的
Self
值都有一个版本。允许您将其直接用作一种类型将允许您选择两个不同的
DataEntry
子类型并尝试进行比较它们。相等运算符只为同一类型的两个对象定义,因此不会定义。谢谢,我想“每个可能的自我”部分是很棘手的,不是吗?我需要考虑下一步要做什么。谢谢你的支持!