2017-10-20 31 views
0

Je suis un peu bloqué en essayant de définir un conteneur pour mes éléments ui.génériques struct implémentant le protocole avec le type associé

Comme je voulais quelque chose qui encapsule une étiquette non unique, une valeur qui peut être un objet comparable et un concept d'être l'option préférée, je suis venu avec le protocole suivant:

protocol OptionProtocol:Comparable { 
    associatedtype Key:Comparable 
    associatedtype Value:Comparable 

    var key:Key { get set } 
    var value:Value { get set } 
    var main:Bool { get set } 

    static func <(lhs: Self, rhs: Self) -> Bool 

    static func ==(lhs: Self, rhs: Self) -> Bool 

} 

extension OptionProtocol { 
    static func <(lhs: Self, rhs: Self) -> Bool { 
     let equalKeys = lhs.key == rhs.key 
     return equalKeys ? lhs.value < rhs.value : lhs.key < rhs.key 
    } 

    static func ==(lhs: Self, rhs: Self) -> Bool{ 
     return (lhs.value == rhs.value) && (lhs.key == rhs.key) 
    } 
} 

Maintenant, je veux mettre en œuvre le protocole dans une structure générique et je ne peux pas comprendre comment. Ce que je veux faire est

struct Option<Key, Value>: OptionProtocol { 
    var key:Key 
    var value:Value 
    var main:Bool 
} 

Mais le compilateur se plaint que Type 'Option<Key, Value>' does not conform to protocol 'OptionProtocol'

Tout pointeur serait utile

Répondre

1

La réponse est assez simple. Je devais contraindre Key et Value dans la structure. La structure suivante est compilée comme prévu

struct Option<Key, Value>:OptionProtocol where Key:Comparable, Value:Comparable { 
    var key:Key 
    var value:Value 
    var main:Bool 
}