gpt4 book ai didi

Swift 无法从上下文推断类型

转载 作者:搜寻专家 更新时间:2023-10-30 22:16:47 24 4
gpt4 key购买 nike

我有一个看似合法的函数,可以将数组转换为字典:

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 })

它工作得很好。为什么?

最佳答案

这个问题只能由 Apple 的编译器工程师真正回答,并且根据上述评论者,它可以/应该被视为一个错误,但这绝对是他们速记语法中的一个漏洞。对于像这样的问题,我在开发论坛上发帖得到了很好的结果。

不过,简单的规则是,无论何时您有多行/需要使用 return 关键字,您都必须显式定义返回类型或所捕获值的类型。此限制可能是由于在紧凑/退化的情况下,您保证只有一个导出点 - val in val,而当您使用 return 时code>关键字,可以有多个返回点。在后一种情况下,您可能会在一行 return 1 上返回一个 Int,而在另一行上返回 nil。在那种情况下,让编译器提示使假设明确是合理的。简而言之,这将需要在编译器中进行更复杂的类型推断,而他们可能还没有做到这一点。

所以 TL;DR,我同意将此报告为错误的建议,同时指定闭包的返回类型。正如您所说,编译器有足够的上下文来推断正确的类型,这一点仍然存在。

请注意,除了您的示例之外,这些情况也适用:

// inferring var dict as a context for lines below
var dict = arrayToDictionary([1, 2, 3], { val in val })

// dict is already defined, so this works:
dict = arrayToDictionary([1, 2, 3], { val in return val })

// explicit final type, compiler infers backwards
let d2:Dictionary<Int, Int> = arrayToDictionary([1, 2, 3], { val in val })

// explicit return type, compiler infers "forewards"
let d3 = arrayToDictionary([1, 2, 3], { val -> Int in return val })

关于Swift 无法从上下文推断类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25980322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com