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
为同一类型。拥有这两种类型的beDataEntry
是不够的,因为您可以拥有lhs
beFooDataEntry
,以及rhs
beBarDataEntry
您需要使用泛型来加强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
子类型并尝试进行比较它们。相等运算符只为同一类型的两个对象定义,因此不会定义。谢谢,我想“每个可能的自我”部分是很棘手的,不是吗?我需要考虑下一步要做什么。谢谢你的支持!