2017-02-19 221 views
0

我想知道下面的代码有什么问题?协议的哈希协议

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 
} 

可在该截图中可以看到,我不断收到错误Protocol 'DataEntry' can only be used as a generic constraint because it has Self or associated type requirements

有谁知道什么可能是错在这里? 你如何实现协议的Hashable协议?

enter image description here

回答

0

==要求lhsrhs是相同类型的。两者都是DataEntry类型是不够的,因为您可以使lhsFooDataEntry,并且rhsBarDataEntry

您需要使用泛型才能执行lhsrhs之间的这种关系。

func ==<T: DataEntry>(lhs: T, rhs: T) -> Bool { 
    return lhs.idx == rhs.idx 
} 
+0

嗯 - 仍然没有帮助。我一直得到相同的错误(即''Protocol'DataEntry'只能用作通用约束,因为它具有自我或相关类型需求......可能是由于我使相当一些类符合' DataEntry'协议,并且这些可能不属于可平等协议 - 即使您有介绍泛型的想法!我想我可能不得不考虑为所有符合'DataEntry'的类创建可平等的工作......或者您有任何其他的想法 – iKK

+0

@iKK什么代码导致该错误 – Alexander

+1

差不多,无论我用'DataEntry'such,例如另一个协议里面:??'协议BalancesModel { \t \t FUNC getEntries(_ completionHandler:@escaping( _条目:[DataEntry]) - >无效) }或类内,例如 - 我创建一个属性:'fileprivat e var entries = [DataEntry]()' – iKK