2014-09-19 22 views
5

我想要typealias字符串鍵值和實現Equatable協議的對象/結構值的字典。所以我寫了這行代碼,但它給了我錯誤,我不知道如何繼續修復。Swift - 帶有實現通用協議的值的Typealias字典

typealias Storage = [String: Equatable] 

我想要使用的類型[字符串:Equatable]如在協議的變量,例如:

protocol StorageModel { 
    var storage: Storage { get set } 
    init(storage: Storage) 
} 

錯誤:

Protocol 'Equatable' can only be used as a generic constraint because it has Self or associated type requirements

enter image description here 任何人都可以提出一個解決方案?

回答

5

一般來說,不需要協議標籤,協議名稱都是一流的類型名稱,可以直接使用:

typealias Storage = [String:Equatable] 

在這種情況下,有什麼錯誤是告訴你的是,因爲Equatable包括func == (lhs:Self, rhs:Self) -> Bool特別lhs:Self,Equatable不能,除非在通用的約束可以使用:

class Generic<T:Equatable> { ... } 

沒有約你想實現什麼,以及如何你想使用StorageModel更多的細節,最好的我可以想出來是:

protocol Matches { 
    typealias T 
    func matches(t:T) -> Bool 
} 

protocol StorageModel { 
    typealias T 
    var storage: [String:T] { get set } 
    init(storage:[String:T]) 
} 

extension Int : Matches { 
    func matches(target:Int) -> Bool { 
     return self == target 
    } 
} 

class MyClass <T:Matches> { 
    var model = [String:T]() 


} 

另一種可能性是用一個通用的,而不是一個協議:

class StorageModel <T:Equatable> { 
    var storage: [String:T] 

    init(storage:[String:T]) { 
     self.storage = storage 
    } 
} 

從那裏,你需要做一些研究,挖掘到雨燕手動,做一些谷歌上搜索,看看什麼解決了你的問題。

+0

換句話說我應該怎麼做到這一點? – 2014-09-20 00:42:09

+1

由於Equatable是如何定義的,我不認爲你可以不定義自己的協議,看起來很像Equatable,即使如此,我認爲你也會遇到同樣的問題。你最好的選擇可能是定義一個新的協議,定義一個等值方法並使用它。 – 2014-09-20 22:01:49

+0

我剛剛更新了這個問題,你能幫我解決問題嗎? – 2014-09-22 08:01:20