问题描述
我正在尝试使用SwiftUI从视图调用函数。该视图从正在调用它的视图中接收一个String参数。
struct BookList: View {
var name: String
var body: some View {
let data: () = getData(from: self.name)
...
}
}
func getData(from url: String){
let task = URLSession.shared.dataTask(with: URL(string: url)!,completionHandler: { data,response,error in
guard let data = data,error == nil else {
print("Something went wrong")
return
}
//Have data
var result: Response?
do {
result = try JSONDecoder().decode(Response.self,from: data)
} catch {
print("Failed to convert \(error.localizedDescription)")
}
guard let json = result else{
return
}
print("Page: \(json.page)")
print("Books: \(json.books.first)")
})
task.resume()
}
struct Response: Codable {
var error: String
var total: String
var page: String
var books: [MyBook]
}
问题是视图启动时我不知道如何调用此函数。在此示例中,我得到了错误:
“函数声明了不透明的返回类型,但是没有返回语句 从其主体中推断出基础类型”
我该如何解决?
解决方法
您需要从data
返回getData
。因为它是异步的,所以您需要一个完成处理程序:
func getData(from url: String,completion: @escaping (Response) -> Void) {
let task = URLSession.shared.dataTask(with: URL(string: url)!,completionHandler: { data,response,error in
...
completion(json)
})
task.resume()
}
并在您的视图中调用.onAppear
:
struct BookList: View {
var name: String
@State var data: Response?
var body: some View {
Text("Your view...")
.onAppear {
getData(from: self.name) { data in
DispatchQueue.main.async {
self.data = data
}
}
}
}
}
,
“函数声明了一个不透明的返回类型,但是在其主体中没有用于从其推断基础类型的返回语句”
此特定错误是因为View
属性中除body
之外还有其他语句。通常,body
属性将使用隐式返回,但是如果包含其他语句(例如,对getData
的调用),则需要使用显式return
。像这样:
var body: some View {
let data: () = getData(from: self.name)
return ...your View(s)
}