无法使用SwiftUI推断复杂的闭包返回类型

Tie*_*eme 7 swiftui xcode11

在Apple的SwiftUI教程的第3部分“ 处理用户输入”之后,出现此错误:

无法推断复杂的闭包返回类型;添加显式类型以消除歧义

我正在使用与教程相同的代码(即使从“完成”示例代码中解决也无法解决该错误)。

有人知道这里出了什么问题吗?

在此处输入图片说明

struct LandmarkRow: View {
    var landmark: Landmark

    var body: some View {
        HStack {
            landmark.image(forSize: 50)
            Text(verbatim: landmark.name)
            Spacer()

            if landmark.isFavorite {
                Image(systemName: "star.fill")
                    .imageScale(.medium)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

无论问题的起因是什么,您实际上如何添加显式类型来消除歧义?在这种情况下,返回类型是什么?

-

更新资料

显然,您不应继续第3篇的第2篇教程的结果。教程之间的某些变化未在教程中进行记录。我已将项目文件添加到Github,以便您可以检查diff

最好从新下载第3教程的Project文件开始第3教程

dir*_*nee 11

问题不在于关闭,而isFavorite在于地标上的财产。

它没有在Landmark类型上声明,并且编译器没有显示未声明的属性错误,无法解析堆栈生成闭包返回类型,因此它在那里显示和错误。

出色的Apple教程编写者,甚至是一个更好的Xcode11编译器。

修理:

  1. isFavoriteLandmark类型上声明变量。
  2. 确保landmarkData.json使用isFavorite = false条目更新每个地标记录,否则应用程序将在运行时崩溃。

  • 在此处查看完整差异 https://github.com/teameh/Apple-SwiftUI-Tutorials-SampleCode/commit/de5d13f4bf72fe57ab31c7ea094414f794a44ba8#diff-3a2226d5793d4d66ab461e74eaR1a99 (2认同)

Dep*_*o B 6

这个问题的一些背景

就像@dirtydanee 已经回答一样,这两个教程之间存在差异。但问题背后的问题是,虽然看起来您正在进行配置,但实际上只是嵌套在函数中的函数,使用泛型和协议“神奇地”将所有内容解析为编译函数。

然而,对这些泛型和协议的一致性需要非常精确,因为如果不是,整个函数树就不能再编译了。但是很难为编译器确定哪些一致性实际上失败了。这就是为什么您会在顶部而不是实际发生的地方看到错误的原因。

强烈建议确保您的视图被分解为自然和简单的块,这样您就不会倾注数百行View代码来找到一个错误。

Dave DeLong一个非常棒的演讲,关于如何从 ViewControllers 组合 Views 直到今天仍然适用:基本上你从不使用 View 作为另一个 View 中的子视图,但你需要分解许多简单的 Views 的 View。否则这些错误会让你抓狂。

  • 作为 swift 和 swift 生态系统的新手,这似乎仍然很不友好。由于 SwiftUI,我开始研究 Swift,并且 SwiftUI 声明给出的错误消息非常难以理解且根本无法理解。错误行在你有错误的地方(对我来说最常见的是缺少参数名称)非常令人沮丧。 (3认同)