微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从视图SwiftUI调用函数

如何解决从视图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 举报,一经查实,本站将立刻删除。