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

Posted

技术标签:

【中文标题】无法使用 SwiftUI 推断复杂的闭包返回类型【英文标题】:Unable to infer complex closure return type with SwiftUI 【发布时间】:2019-06-04 20:18:00 【问题描述】:

按照 Apple 关于 SwiftUI 的教程的第 3 部分,Handling User Input,我收到此错误:

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

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

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

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 的项目文件来重新开始第 3 次教程。

【问题讨论】:

【参考方案1】:

问题不在于关闭,而在于地标上的 isFavorite 属性。

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

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

修复:

    Landmark 类型上声明isFavorite 变量。 确保使用 isFavorite = false 条目更新每个里程碑记录的 landmarkData.json,否则应用将在运行时崩溃。

【讨论】:

检查!我希望我可以继续上一个教程的结果,但显然他们更改了landmarkData.json 以及教程之间的一些课程!谢谢。 在此处查看完整差异github.com/teameh/Apple-SwiftUI-Tutorials-SampleCode/commit/…【参考方案2】:

这个问题的一些背景

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

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

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

Dave DeLong 有 a really great talk 关于如何从 ViewControllers 组合 Views 直到今天仍然适用:基本上你永远不会将 View 用作另一个 View 中的子视图,但你需要将 View 分解为许多简单的 Views。否则这些错误会让你发疯。

【讨论】:

作为 swift 和 swift 生态系统的新手,这似乎仍然很不友好。由于 SwiftUI,我开始研究 Swift,而 SwiftUI 声明给出的错误消息非常不可读,根本无法理解。在你有错误的地方(我最常缺少参数名称)的错误线是非常令人沮丧的。 是的,但是错误消息一直在改进,就编译器反馈和错误消息的实用性而言,它比 Swift 1.0 好得多。那真的很粗糙。【参考方案3】:

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

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

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

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

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

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

希望这可以帮助一些人

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于无法使用 SwiftUI 推断复杂的闭包返回类型的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 如何修复“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”

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

Swift Combine:无法推断复杂的闭包返回类型错误

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

在 VStack 中包装 WebView 时出错:无法推断复杂的闭包返回类型;添加显式类型以消除歧义

无法使用切换行为来触发SWIFTUI中的.buttonStyle