我不知道如何解决此错误“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”。我已经尝试过一切(我能做到)并且不起作用
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
}
请帮助
答案 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
来提供一些帮助,但是错误通常会转移到另一个地方。经过一番困惑之后,您很有可能会使其正常工作,但是我可以向您保证,它不会是漂亮的代码。因此,我将选择克里斯的解决方案。
答案 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
}