2017-10-20 99 views
0

我有点卡住试图为我的UI元素定义一个容器。泛型结构实现协议与关联的类型

正如我想要的东西,它封装了一个非唯一的标签,一个值,可以是任何可比的对象,被优先选择的一个概念,我想出了以下协议:

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) 
    } 
} 

现在我想在通用结构中实现协议,我不知道如何。我想要做的就是

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

但是,编译器抱怨Type 'Option<Key, Value>' does not conform to protocol 'OptionProtocol'

任何指针将是有益的

回答

1

的答案是非常简单的。我需要在结构中约束Key和Value。 以下结构编译如预期

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