我有一个看似合法的函数,可以将数组转换为字典:
func arrayToDictionary<Key : Hashable, Value>
(source: Array<Value>, key: Value -> Key) -> Dictionary<Key, Value> {
var dictionary = Dictionary<Key, Value>()
for element in source {
let key = key(element)
dictionary[key] = element
}
return dictionary
}
现在,当我尝试调用它时:
let dict = arrayToDictionary([1, 2, 3], { val in return val })
我遇到了一个错误 - 无法将表达式的类型“($T6,(($T9) -> ($T9) -> $T8) -> (($T9) -> $T8) -> $T8)”转换为类型“Hashable”。
奇怪的是,如果我使用隐式返回:
let dict = arrayToDictionary([1, 2, 3], { val in val })
或者简写为:
let dict = arrayToDictionary([1, 2, 3], { $0 })
它表现得非常良好。为什么呢?
return
)似乎也可以正常工作。 - Mike Sreturn
明确将val
定义为Int
类型的代码:let dict = arrayToDictionary([1, 2, 3], { (val: Int) in return val })
会导致错误:'NSNumber' is not a subtype of 'Int'
。如果再次移除return
则代码正常运行。 - Mike S