21

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

不管问题的原因是什么,你怎么能在这里添加一个明确的类型来消除歧义?在这种情况下,返回类型是什么?

--

更新

显然,您不应该继续使用第三个教程的第二个教程的结果。教程中未记录的教程之间发生了一些变化。我已将项目文件添加到 Github,因此您可以查看 diff

最好通过重新下载第 3 教程的项目文件来重新开始第3 教程

4

5 回答 5

24

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

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

干得好 Apple 教程作者,甚至更好的 Xcode11 编译器。

修理:

  1. 在类型上声明isFavorite变量。Landmark
  2. 确保landmarkData.json使用条目更新每个地标记录isFavorite = false,否则应用程序将在运行时崩溃。
于 2019-06-04T21:02:27.567 回答
6

这个问题的一些背景

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

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

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

Dave DeLong就如何从 ViewControllers 组合 Views 进行了非常精彩的演讲,直到今天仍然适用:基本上,您永远不会将 View 用作另一个 View 中的子视图,但您需要将 View 分解为许多简单的 Views。否则这些错误会让你发疯。

于 2019-06-05T14:42:17.717 回答
2

对于在 SwiftUI 上遇到此错误并寻找调试视图堆栈的方法的人

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

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

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

var debug: some View {
        MyViewWithError(property: self.property)
}

大多数情况下,您会遇到这种情况,因为您传递的是属性 ( self.property) 而不是绑定 ( self.$property)

希望这可以帮助一些人

于 2020-07-08T07:34:58.283 回答
0

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

于 2020-08-28T22:07:37.630 回答
0

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

于 2020-07-21T18:46:14.387 回答