使用Xcode 10.2.1,我试图在SO上编译一些示例代码以响应另一个线程(有人试图在迭代一个集合的同时对其进行突变,但这是另一个故事……)>
func foo(_ array: [String]) {
for (index, item) in array { // <<-- Error on this line
print("Item \(item)")
}
}
使用Swift 5或Swift 4.2的默认设置,以上代码在for循环上生成错误“表达式类型'[String]'不明确,没有更多上下文”。这是为什么?我还尝试制作函数定义func foo(_ array: Array<String>)
,但是会产生几乎相同的错误“表达式类型'Array'在没有更多上下文的情况下是模棱两可的”。
经过反复的摸索,我意识到自己犯了一个骨头错误,却忘记打给enumerated()
:for (index, item) in array.enumerated()
的电话。为什么错误消息如此令人难以置信?考虑到我键入的表达式出了什么问题,我试图遍历一个集合并将每个条目映射到一个元组中,所以我应该遇到类型不匹配的错误。编译器如何才能认为表达式[String]
是不明确的?
我经常对Swift编译器的错误消息印象深刻,但这一消息似乎特别糟糕。
答案 0 :(得分:0)
这是我的猜测。基本上是说它无法推断(index, item)
的类型,因为它查看了array
的类型并发现了多个匹配的候选函数。它无法充分缩小选择范围,或者可能将选择范围缩小到无。
要走得更远,可能需要检查类型推断代码以及与Array<String>
有关的所有内容。
您可能会在Swift项目中将其作为Bug提出,因为消息有点令人困惑。它可能应该说类似“无法推断出要匹配的类型(索引,项目)”之类的内容。