2017-10-20 128 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 
}