在Apple的SwiftUI教程Handling User Input的第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,以便您可以check out the diff。
最好从全新下载3rd tutorial的Project文件开始第三个教程。
答案 0 :(得分:10)
问题不在于闭包,而是地标上的main()
属性。
未在isFavorite
类型上声明它,并且编译器没有显示未声明的属性错误,无法解析堆栈构建闭包返回类型,因此在此处显示并出错。
出色的Apple教程编写者,甚至是一个更好的Xcode11编译器。
要修复:
Landmark
类型的isFavorite
变量。 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源的类型不同。