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

时间:2020-03-28 08:48:49

标签: swift xcode 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  
} 

请帮助

2 个答案:

答案 0 :(得分:1)

作为克里斯回答的补充:

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

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

(element) -> (Int) in的意思是:我们得到一个参数并将其命名为element,因此我们可以在闭包内部使用它,闭包的返回类型为Int

通常,我们在那小段代码的第二行使用简写形式:

myArray.forEach { element in

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

但是由于(我相信)Swift 5.1,所以有了一条新规则:当函数/变量/闭包的内容仅是一行代码时,我们不需要显式编写{{ 1}}。因此,在上述情况下,我们也可以说:

return

SwiftUI经常使用它。但是还有其他事情:SwiftUI中的闭包是特殊的@ViewBuilder闭包。因此,您可以将多个View放在另一个View中,就像其中具有多个tenTimes = myArray.map { element in element * 10 } 的函数一样。但是,当您使用其他代码(例如return语句)时,事情就会变得一团糟。 SwiftUI不了解您想要什么。
有时您可以通过使用显式let来提供一些帮助,但是错误通常会转移到另一个地方。经过一番困惑之后,您很有可能会使其正常工作,但是我可以向您保证,它不会是漂亮的代码。因此,我将选择克里斯的解决方案。


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

答案 1 :(得分:0)

请阅读swiftui初学者教程,因为您犯了很多初学者错误。

要获得快速帮助,请查看以下内容:

struct ContentView: View {


    @State var content: String = "start"
    @State var responce : String = ""
    @State var candidates : Candidates = Candidates(candidates: [])

    var body: some View {

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



            Text(responce)
                .onAppear() {
                    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()
                    self.candidates = try! jsDec.decode(Candidates.self, from: contentData!)
            }

        }
    }
}

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
}