创建 Comparable 和 Hashable 键的字典?
Create dictionary of Comparable and Hashable keys?
这似乎是一个非常基本的问题,但一直找不到答案。
这是我试过的方法
var items = [Comparable: [NSObject]]()
var items = [Comparable, Hashable: [NSObject]]()
var items = [protocol<Comparable, Hashable>: [NSObject]]()
typealeas Key = T where T: Hashable, T: Comparable
var items = [Key: [NSObject]]()
Comparable
和Hashable
都不能单独用作类型,因为它们的定义中包含Self
,只能用作泛型约束。
无论如何,如果您考虑一下,您的字典能够具有不同可比较类型的键,这实际上没有任何意义,因为每个可比较类型只能与它自己的类型进行比较,而不能与其他类型进行比较。
如果你有一个字典,它只会有一个特定的可比较的、可散列的类型,你可以使包含此代码的函数或 class 通用并在那里约束类型参数:
func foo<T : protocol<Comparable, Hashable> >() {
var items = [T: [NSObject]]()
}
更新@newacct 的回答:
从 Swift 4.2 开始,不再使用 protocol < >
语法。而是像这样使用 &
:
<T: Comparable & Hashable>
这似乎是一个非常基本的问题,但一直找不到答案。
这是我试过的方法
var items = [Comparable: [NSObject]]()
var items = [Comparable, Hashable: [NSObject]]()
var items = [protocol<Comparable, Hashable>: [NSObject]]()
typealeas Key = T where T: Hashable, T: Comparable
var items = [Key: [NSObject]]()
Comparable
和Hashable
都不能单独用作类型,因为它们的定义中包含Self
,只能用作泛型约束。
无论如何,如果您考虑一下,您的字典能够具有不同可比较类型的键,这实际上没有任何意义,因为每个可比较类型只能与它自己的类型进行比较,而不能与其他类型进行比较。
如果你有一个字典,它只会有一个特定的可比较的、可散列的类型,你可以使包含此代码的函数或 class 通用并在那里约束类型参数:
func foo<T : protocol<Comparable, Hashable> >() {
var items = [T: [NSObject]]()
}
更新@newacct 的回答:
从 Swift 4.2 开始,不再使用 protocol < >
语法。而是像这样使用 &
:
<T: Comparable & Hashable>