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

Woj*_*per 2 xcode swift swiftui

我不知道如何修复此错误“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”。我已经尝试了一切(我能做的)但不起作用

import SwiftUI  

struct ContentView: View {  

    @State var content: String = "start"  


    var body: some View {  

        VStack { // Unable to infer complex closure return type; add explicit type to disambiguate  

            self.content = try! String(contentsOf: URL(string: "http://zyglarski.pl/swift-http-docs/tinder_list.php")!)  

            var contentData = self.content.data(using: .utf8)  
            var jsDec = JSONDecoder()  
            var responce = try! jsDec.decode(Candidates.self, from: contentData!)  

            Text(responce)  
        }  
    }  
}  

struct ContentView_Previews: PreviewProvider {  
    static var previews: some View {  
        ContentView()  
    }  
}  


struct Candidates: Codable {  
    let candidates:[Candidate]  
}  
struct Candidate: Codable {  
    let filename: String  
    let name: String  
    let age: String  
    let distance: String  
    let match: String  
} 
Run Code Online (Sandbox Code Playgroud)

请帮助

cbj*_*rup 6

作为克里斯回答的补充:

\n

让我们看一下闭包。一个“正常”的关闭,我们可以看到例如.map { ... }数组,它对列表的每个元素应用一个函数,并返回一个包含结果的新列表,如下所示:

\n
let myArray = [1, 2, 3, 4, 5]\nlet tenTimes = myArray.map { (element) -> (Int) in\n    return element * 10\n}\n// tenTimes is [10, 20, 30, 40, 50]\n
Run Code Online (Sandbox Code Playgroud)\n

(element) -> (Int) in意思是:我们得到一个参数并调用它,element这样我们就可以在闭包中使用它,闭包的返回类型是Int

\n

通常,我们对这一小段代码的第二行使用简写版本:

\n
let tenTimes = myArray.map { element in\n
Run Code Online (Sandbox Code Playgroud)\n

在这种情况下,Swift 可以推断出返回类型。

\n

但从(我相信)Swift 5.1开始,出现了一条新规则:当函数/变量/闭包的内容只有一行代码时,我们不需要显式地写出单词return所以在上面的例子中,我们也可以说:

\n
tenTimes = myArray.map { element in\n    element * 10\n}\n
Run Code Online (Sandbox Code Playgroud)\n

几乎{}你在 SwiftUI 中看到的每一个都意味着你正在使用闭包。关于最后一条规则return在 SwiftUI 中经常应用。

\n

但还有其他一些事情:SwiftUI 中的闭包是特殊的 @ViewBuilder 闭包。因此,您可以将多个 View 放入另一个 View 中,就像拥有一个包含多个returns 的函数一样。但是当您使用其他代码(例如let语句)时,事情就会变得混乱。SwiftUI 不明白你想要什么。
\n有时你可以通过使用explicit 来帮助它一点return,但通常错误只是转移到另一个地方。经过大量的困惑之后,您有可能让它工作,但我可以向您保证,它不会是漂亮的代码。因此,我会选择Chris的解决方案。

\n

编辑 2021:我对“具有多个返回语句的函数”感到 na\xc3\xafve。更复杂的事情正在发生。该视频具体解释了什么:https://developer.apple.com/videos/play/wwdc2021/10253/
\n这也可能澄清为什么将其他语句放入这些特殊闭包中不起作用。

\n
\n

如果您想了解有关闭包的更多信息,请参阅官方文档的链接: https: //docs.swift.org/swift-book/LanguageGuide/Closures.html。非常有趣,但是信息量很大!

\n