如何解决从视图SwiftUI调用函数
我正在尝试使用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)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。