【发布时间】:2016-03-07 22:04:41
【问题描述】:
我正在尝试将两种不同的泛型类型放入一个集合中。在这个例子中,有两个数组,一个包含Ints,另一个包含Strings。
let intArray = Array<Int>()
let stringArray = Array<String>()
let dict = [1:intArray, "one": stringArray]
错误为 Type of expression is ambiguous without more context.
所以我尝试指定Dictionary的类型
let dict: [Hashable: Any] = [1:intArray, "one": stringArray]
这会导致两个错误。
- 不支持将“Hashable”用作符合“Hashable”协议的具体类型。
- 协议“Hashable”只能用作通用约束,因为它具有 Self 或关联类型要求
添加import Foundation 并使用NSDictionary 作为类型可以正常工作。
let dict: NSDictionary = [1:intArray, "one": stringArray]
但这在不使用 Foundation 的情况下在纯 Swift 中也应该是可能的。 Dictionary 必须是什么类型的?
edit:这显然与键的类型有关。它们必须是同一类型,而不仅仅是符合Hashable。
let dict: [Int:Any] = [1:intArray, 2: stringArray]
这行得通。但是是否可以使值的类型更精确? [Int:Array<Any>] 不起作用。
【问题讨论】:
-
根本原因是 Hashable 符合 Equatable,而 Equatable 有
==(lhs: Self, rhs: Self)要求,这就是“协议'Hashable'只能用作通用约束,因为它有 Self或相关的类型要求”。 -
另外,您需要
==来解决哈希冲突,所以这似乎是编译器的有效投诉。 -
@AntonBronnikov 相关(但可能是重复的)链接线程涵盖了具有相同类型键的字典中的通用 values ,而这涵盖了值和键,其中后者 (通用键)是更复杂的部分。然而,我意识到这个威胁可能是 the one I linked to in the end of my answer 的副本。
-
@dfri,对不起,你是对的。 OP 的问题更广泛。