我如何扩展其价值本身就是字典的字典?
How can I extend dictionaries whose values are dictionaries themselves?
说我想用一些功能扩展嵌套字典。使用伪Swift,这是我的目标:
extension Dictionary where Value: Dictionary {
typealias K1 = Key
typealias K2 = Value.Key
typealias V = Value.Value
subscript(k1: K1, k2: K2) -> V? {
return self[k1]?[k2]
}
}
不过我无法让它工作。类型边界不能是非协议类型; Dictionary 实现的协议没有提供我需要引用的方法和类型;访问泛型的类型很麻烦;等等。我试过都没有用。
有什么解决方案?
我们可以在这里使用的一个技巧(我敢说模式吗?)是定义我们的 own 协议(我们从未打算在其他任何地方使用它)它声明了我们需要的所有内容和无论如何,我们知道 Dictionary
符合。
protocol DictionaryProtocol {
associatedtype Key: Hashable
associatedtype Value
subscript(key: Key) -> Value? { get set }
}
extension Dictionary: DictionaryProtocol {}
extension Dictionary where Value: DictionaryProtocol {
typealias K1 = Key
typealias K2 = Value.Key
typealias V = Value.Value
subscript(k1: K1, k2: K2) -> V? {
return self[k1]?[k2]
}
}
这个解决方案适用于数组的数组,可能还有很多类似的情况。
说我想用一些功能扩展嵌套字典。使用伪Swift,这是我的目标:
extension Dictionary where Value: Dictionary {
typealias K1 = Key
typealias K2 = Value.Key
typealias V = Value.Value
subscript(k1: K1, k2: K2) -> V? {
return self[k1]?[k2]
}
}
不过我无法让它工作。类型边界不能是非协议类型; Dictionary 实现的协议没有提供我需要引用的方法和类型;访问泛型的类型很麻烦;等等。我试过都没有用。
有什么解决方案?
我们可以在这里使用的一个技巧(我敢说模式吗?)是定义我们的 own 协议(我们从未打算在其他任何地方使用它)它声明了我们需要的所有内容和无论如何,我们知道 Dictionary
符合。
protocol DictionaryProtocol {
associatedtype Key: Hashable
associatedtype Value
subscript(key: Key) -> Value? { get set }
}
extension Dictionary: DictionaryProtocol {}
extension Dictionary where Value: DictionaryProtocol {
typealias K1 = Key
typealias K2 = Value.Key
typealias V = Value.Value
subscript(k1: K1, k2: K2) -> V? {
return self[k1]?[k2]
}
}
这个解决方案适用于数组的数组,可能还有很多类似的情况。