2017-02-19 10 views
0

Ich frage mich, was ist falsch mit dem folgenden Code?Hash-Protokoll für ein Protokoll

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 
} 

Wie in diesem Screenshot zu sehen ist, ich bekomme immer wieder den Fehler Protocol 'DataEntry' can only be used as a generic constraint because it has Self or associated type requirements

Weiß jemand, was hier falsch sein könnte ?? Wie implementieren Sie ein Hashable-Protokoll für ein Protokoll?

enter image description here

Antwort

0

== erfordert die lhs und rhs vom gleichen Typ sein. Beide sind vom Typ DataEntry nicht ausreichend, da Sie die lhsFooDataEntry und die rhsBarDataEntry sein könnten.

Sie müssen Generika verwenden, um diese Beziehung zwischen lhs und rhs zu erzwingen.

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

Hmm - immer noch nicht geholfen. Ich bekomme immer den gleichen Fehler (dh "Protocol 'DataEntry' kann nur als generische Einschränkung verwendet werden, da es Selbst- oder assoziierte Typprüfungen benötigt"). Könnte es daran liegen, dass ich einige Klassen der '' DataEntry-Protokoll.Und diese fallen vielleicht nicht unter das Equatable-Protokoll - auch nicht mit Ihrer Idee, Generika einzuführen! Ich denke, ich muss vielleicht gleichwertige Arbeit für alle Klassen machen, die ich mit DataEntry gemacht habe ... Oder Sie haben keine andere Idee – iKK

+0

@iKK Code, was das Fehler verursacht – Alexander

+1

so ziemlich überall dort, wo ich 'DataEntry'such wie zum Beispiel in einem anderen Protokoll verwenden:?' Protokoll BalancesModel { \t \t func getEntries (_ completionHandler: @escaping (_ entries: [DataEntry]) -> Void) } 'oder in einer Klasse, zum Beispiel - wo ich eine Eigenschaft:' fileprivat e var entries = [DataEntry]() ' – iKK

Verwandte Themen