【问题标题】:Calling function from view SwiftUI从视图 SwiftUI 调用函数
【发布时间】:2020-12-19 00:57:25
【问题描述】:

我正在尝试使用 SwiftUI 从视图中调用一个函数。此视图从调用它的视图接收字符串参数。

struct BookList: View {
    var name: String
    var body: some View {
        let data: () = getData(from: self.name)
        ...
    }
}

get data 函数正在消费一个 rest 服务并获取一些数据。

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]
}

问题是我不知道在视图启动时如何调用这个函数。在这个示例中,我收到了错误:

"函数声明了一个不透明的返回类型,但没有返回语句 在它的主体中推断一个基础类型"

我该如何解决?

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    您需要从getData 返回data。因为它是异步的,所以你需要一个完成处理程序:

    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
                        }
                    }
                }
        }
    }
    

    【讨论】:

      【解决方案2】:

      “函数声明了一个不透明的返回类型,但它的主体中没有返回语句来推断底层类型”

      此特定错误是因为您的 body 属性中有除 Views 之外的其他语句。通常,body 属性将使用隐式返回,但如果您包含其他语句(例如对 getData 的调用),则需要使用显式 return。像这样:

          var body: some View {
              let data: () = getData(from: self.name)
              return ...your View(s)
          }
      

      【讨论】:

        猜你喜欢
        • 2020-02-16
        • 1970-01-01
        • 2020-05-12
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多