【发布时间】:2014-07-30 15:29:15
【问题描述】:
我想知道是否可以以某种方式使用 x, y 对作为我的字典的键
let activeSquares = Dictionary <(x: Int, y: Int), SKShapeNode>()
但我得到了错误:
Cannot convert the expression's type '<<error type>>' to type '$T1'
和错误:
Type '(x: Int, y: Int)?' does not conform to protocol 'Hashable'
那么..我们怎样才能使它符合?
【问题讨论】:
-
我确定
(x:Int,y:Int)不是可哈希的东西:) -
我认为你应该只创建一个以这种方式建模的结构类型并使其符合
Hashable。 -
@sjeohp 他们不能,你可以简单地使用结构体创建一个简单的值类型。
-
元组不能用作键(或者具体来说,不是
hashable)的原因是因为它们不是严格不可变的。如果您使用let定义它,它是不可变的,但如果您使用var定义它,它不是。在字典中用作键的散列必须根据散列表的定义是不可变的,并且由于任何类型的合理散列将直接依赖于容器内的值,因此不能对可变容器进行散列(同样,不可变容器包含可变对象不能被合理地散列)。 -
@aruisdante 元组的可变性是无关紧要的——它们是值类型,因此,抛开散列性不谈,它将是存储在字典中的元组的不可变副本。唯一的问题是元组不符合
Hashable并且不能扩展为这样做。元组并不比字符串或Ints 更易变,它们就像字典键一样。
标签: dictionary tuples swift