【发布时间】:2020-03-01 00:11:27
【问题描述】:
因为元组在 Swift 中不可散列,所以我创建了一个通用结构 Couple 来包含两个元素,它们组合起来可以用作字典的键。
struct Couple<U: Hashable, V: Hashable>: Hashable {
let u: U
let v: V
init( _ u: U, _ v: V ) {
self.u = u
self.v = v
}
}
var dictionary: [ Couple<Int,Int> : Any ] = ...
现在,我想使用 Couple 来扩展 Dictionary。
extension Dictionary where Key == Couple<U: Hashable, V: Hashable>, Value == Any {
func exampleConvertToArray() -> [ ( U, V, Any ) ] {
}
}
无论我在扩展语句中如何引用 Couple, U, V,编译器都会报错。如果我改为将泛型添加到函数定义中,编译器也会报错。
如果类型不是通用的 (extension Dictionary where Key == Couple<Int, Int>, Value == Any),一切都很好。
如何创建这个通用扩展?
【问题讨论】:
-
旁注:不要将
Value锁定为Any。如果消费者想要使用Any值,他们已经可以这样做了。 -
如果您希望两个元素具有相同的类型,则无需创建两个通用的可散列类型。
-
struct Couple<H: Hashable>: Hashable {987654329init( _ left: H, _ right: H) {987654331self.right = right987654333}987654335func exampleConvertToArray<H>() -> [(H, H, Any)] where Key == Couple<H> {987654337}987654339 @ 跨度> -
顺便说一句,我认为更好的结构命名是
Pair
标签: swift dictionary generics extension-methods