为什么此代码会生成如此令人困惑的错误消息?

时间:2019-07-11 12:39:55

标签: swift

使用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编译器的错误消息印象深刻,但这一消息似乎特别糟糕。

1 个答案:

答案 0 :(得分:0)

这是我的猜测。基本上是说它无法推断(index, item)的类型,因为它查看了array的类型并发现了多个匹配的候选函数。它无法充分缩小选择范围,或者可能将选择范围缩小到无。

要走得更远,可能需要检查类型推断代码以及与Array<String>有关的所有内容。

您可能会在Swift项目中将其作为Bug提出,因为消息有点令人困惑。它可能应该说类似“无法推断出要匹配的类型(索引,项目)”之类的内容。