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

无法使用SwiftUI推断复杂的闭包返回类型,swiftui,xcode11,Swiftui,Xcode11,在苹果关于SwiftUI的教程的第3部分中,我发现了以下错误: 无法推断复杂的闭包返回类型;添加显式类型以消除歧义 我使用的代码与教程中的代码相同(即使使用“完整”示例代码也不能解决错误) 有人知道这里出了什么问题吗 不管问题的原因是什么,您如何在这里添加显式类型来消除歧义?在这种情况下,返回类型是什么 -- 更新 显然,你不应该在第三节继续第二节教程的结果。在本教程中未记录的教程之间,有些内容发生了更改。我已将项目文件添加到Github,因此您可以 最好从新下载的项目文件开始第三个教程 问题

在苹果关于SwiftUI的教程的第3部分中,我发现了以下错误:

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

我使用的代码与教程中的代码相同(即使使用“完整”示例代码也不能解决错误)

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

不管问题的原因是什么,您如何在这里添加显式类型来消除歧义?在这种情况下,返回类型是什么

--

更新

显然,你不应该在第三节继续第二节教程的结果。在本教程中未记录的教程之间,有些内容发生了更改。我已将项目文件添加到Github,因此您可以


最好从新下载的项目文件开始第三个教程

问题不在于闭包,而在于landmark上的
isFavorite
属性

它没有在
Landmark
类型上声明,编译器没有显示未声明的属性错误,无法解析stacks build closure返回类型,因此在那里显示and error

非常好的苹果教程作者和更好的Xcode11编译器

要修复:

  • Landmark
    类型上声明
    isFavorite
    变量
  • 确保使用
    isFavorite=false
    条目为每个landmark记录更新
    landmarkData.json
    ,否则应用程序将在运行时崩溃
  • 这个问题的一些背景 就像@dirtydanee已经回答的那样,这两个教程之间存在差异。但问题背后的问题是,虽然看起来您正在进行配置,但实际上只是嵌套在函数中的函数,使用泛型和协议“神奇地”将所有内容解析为编译函数

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

    强烈建议您确保将视图分解为自然和简单的块,这样您就不会在数百行
    View
    代码中发现一个bug


    had讨论了如何从ViewController合成视图,这一点直到今天仍然适用:基本上,您从未在另一个视图中使用视图作为子视图,但您需要将视图分解为许多简单的视图。否则这些错误会让你发疯。

    适用于在SwiftUI上遇到此错误并正在寻找调试其视图堆栈的方法的用户。

    此错误主要发生在一个子视图上存在编译问题时

    1-确保父视图可以支持多个子视图(VStack、ZStack),并且子视图少于10个。有时您可能需要添加组包装器

    2-如果这不是问题所在,则一个子视图可能存在问题。试着找出你怀疑有问题的人。通常我将子视图复制到属性中,会出现不同的错误

    var debug: some View {
            MyViewWithError(property: self.property)
    }
    
    大多数情况下,您会遇到这种情况,因为您传递的是属性(
    self.property
    ),而不是绑定(
    self.$property


    希望这能帮助一些人

    我打字时遇到了这个错误。当代码出现语法问题时,也会出现此错误。只需检查您的更改是否正确

    我在一个子视图中遇到了问题,其中@Binding道具属于不同类型的@Binding源。

    检查!我原以为我可以继续上一个教程的结果,但很明显他们改变了
    landmarkData.json
    和教程之间的一些类!谢谢。作为swift和swift生态系统的新来者,请看这里的完整差异,这似乎仍然非常不友好。我开始研究Swift,因为SwiftUI和SwiftUI声明给出的错误消息非常不可读,根本无法理解。错误行远离你有错误的地方(对我来说,最常见的是缺少参数名称)是非常令人沮丧的。是的,但是错误消息一直在改进,它在编译器反馈和错误消息的有用性方面比Swift 1.0要好得多。那真的很粗糙。
    var debug: some View {
            MyViewWithError(property: self.property)
    }