无法使用SwiftUI

时间:2019-06-04 20:18:00

标签: swiftui xcode11

在Apple的SwiftUI教程Handling User Input的第3部分中,出现此错误:

  

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

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

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

enter image description here

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,以便您可以check out the diff

最好从全新下载3rd tutorial的Project文件开始第三个教程。

5 个答案:

答案 0 :(得分:10)

问题不在于闭包,而是地标上的main()属性。

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

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

要修复:

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

答案 1 :(得分:2)

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

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

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

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

self.property

大多数情况下,您会遇到此问题,因为您传递了属性(self.$property,而不是绑定(Installed /home/g573072/anaconda3/lib/python3.7/site-packages/pyinstaller-4.0.dev0+7a7eb11a7b-py3.7.egg Processing dependencies for pyinstaller==4.0.dev0+7a7eb11a7b Searching for altgraph Reading https://pypi.org/simple/altgraph/

希望这可以帮助某些人

答案 2 :(得分:1)

此问题的一些背景

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

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

强烈建议确保将您的视图分解为自然且简单的块,以免浪费大量的View代码行来查找一个错误。

Dave DeLong关于如何从ViewController构成视图的问题a really great talk直到今天仍然有效:基本上,您永远不会将View用作另一个View的子视图,但是您需要分解许多简单的View意见。否则,这些错误会让您发疯。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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