Swift - 带有实现通用协议的值的Typealias字典

问题描述:

我想要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 任何人都可以提出一个解决方案?

一般来说,不需要协议标签,协议名称都是一流的类型名称,可以直接使用:

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