在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。
dir*_*nee 11
问题不在于关闭,而isFavorite在于地标上的财产。
它没有在Landmark类型上声明,并且编译器没有显示未声明的属性错误,无法解析堆栈生成闭包返回类型,因此它在那里显示和错误。
出色的Apple教程编写者,甚至是一个更好的Xcode11编译器。
修理:
isFavorite在Landmark类型上声明变量。landmarkData.json使用isFavorite = false条目更新每个地标记录,否则应用程序将在运行时崩溃。就像@dirtydanee 已经回答一样,这两个教程之间存在差异。但问题背后的问题是,虽然看起来您正在进行配置,但实际上只是嵌套在函数中的函数,使用泛型和协议“神奇地”将所有内容解析为编译函数。
然而,对这些泛型和协议的一致性需要非常精确,因为如果不是,整个函数树就不能再编译了。但是很难为编译器确定哪些一致性实际上失败了。这就是为什么您会在顶部而不是实际发生的地方看到错误的原因。
强烈建议确保您的视图被分解为自然和简单的块,这样您就不会倾注数百行View代码来找到一个错误。
Dave DeLong有一个非常棒的演讲,关于如何从 ViewControllers 组合 Views 直到今天仍然适用:基本上你从不使用 View 作为另一个 View 中的子视图,但你需要分解许多简单的 Views 的 View。否则这些错误会让你抓狂。
| 归档时间: |
|
| 查看次数: |
2783 次 |
| 最近记录: |