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
任何人都可以提出一个解决方案?
答
一般来说,不需要协议标签,协议名称都是一流的类型名称,可以直接使用:
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
}
}
从那里,你需要做一些研究,挖掘到雨燕手动,做一些谷歌上搜索,看看什么解决了你的问题。
换句话说我应该怎么做到这一点? – 2014-09-20 00:42:09
由于Equatable是如何定义的,我不认为你可以不定义自己的协议,看起来很像Equatable,即使如此,我认为你也会遇到同样的问题。你最好的选择可能是定义一个新的协议,定义一个等值方法并使用它。 – 2014-09-20 22:01:49
我刚刚更新了这个问题,你能帮我解决问题吗? – 2014-09-22 08:01:20