Element 是一个元组:
typealias Element = (Key, Value)
这与您尝试将其与(字典)进行比较的类型不匹配。你甚至不能说像where Element:(String, AnyObject) 这样的话,因为元组不是这样子类型的。例如,考虑:
var x: (CustomStringConvertible, CustomStringConvertible) = (1,1)
var y: (Int, Int) = (1,1)
x = y // Cannot express tuple conversion '(Int, Int)' to ('CustomStringConvertible', 'CustomStringConvertible')
比较:
var x1:CustomStringConvertible = 1
var y1:Int = 1
x1 = y1 // No problem
我怀疑你得到“未声明的类型”是因为Element 不再是未绑定的类型参数,而是绑定的类型参数。 Dictionary 符合 SequenceType 这里。所以你不能对它进行参数化(至少不能在一个步骤中;你必须通过另一层类型参数来追踪它以发现它“最终”未绑定)。这似乎是一个糟糕的错误消息,但我怀疑它是从“可能在这里使用的类型列表中未声明的类型”中冒出来的。我认为值得打开雷达以获得更好的错误消息。
相反,我认为你的意思是:
extension Dictionary where Key: String, Value: AnyObject { }
为 Swift 2 编辑:
这不再是合法的 Swift。您只能基于协议进行约束。等效代码是:
protocol JSONKey {
func toString() -> String
}
extension String: JSONKey {
func toString() -> String { return self }
}
extension Dictionary where Key: JSONKey, Value: AnyObject { ... }