Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 将JSON解码错误传递到可操作的内容_Swift - Fatal编程技术网

Swift 将JSON解码错误传递到可操作的内容

Swift 将JSON解码错误传递到可操作的内容,swift,Swift,当我在JSON中找不到任何数据时,我试图改进我的错误处理。下面的函数工作正常,没有任何问题,除非我发现了错误。我不确定如何传递错误以提示用户,或者如果googlebusinessinfoisnil我可能没有数据并且传递了一个一般性错误,那么处理错误的方法是什么 以下是我的功能: func getBusinessReviews(googleUrl: String, completion: @escaping (WelcomeReview?) -> ()) { // Creat

当我在JSON中找不到任何数据时,我试图改进我的错误处理。下面的函数工作正常,没有任何问题,除非我发现了错误。我不确定如何传递错误以提示用户,或者如果
googlebusinessinfo
is
nil
我可能没有数据并且传递了一个一般性错误,那么处理错误的方法是什么

以下是我的功能:

    func getBusinessReviews(googleUrl: String, completion: @escaping (WelcomeReview?) -> ()) {
    // Create URL
    let url = URL(string: googleUrl)
    guard let requestUrl = url else { fatalError() }
    // Create URL Request
    var request = URLRequest(url: requestUrl)
    // Specify HTTP Method to use
    request.httpMethod = "GET"
    //Set HTTP Header

    // Send HTTP Request
    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
        // Specify HTTP Method to use
        request.httpMethod = "GET"
        print("(Google)Do we have any data: \(String(describing: data))")
        // Check if Error took place
        if let error = error {
            print("Error took place \(error)")
            return
        }

        // Read HTTP Response Status code
        if let response = response as? HTTPURLResponse {
            print("(Google)Response HTTP Status code: \(response.statusCode)")
        }

        // Convert HTTP Response Data to a simple String
        if let data = data, let dataString = String(data: data, encoding: .utf8) {
            print("Googledata Response data string:\n \(dataString)")
        }

        if let googlebusinessdata = data {
            do {
                let googlebusinessinfo = try JSONDecoder().decode(WelcomeReview.self, from: googlebusinessdata)
                print("googledata \(googlebusinessinfo)")
                completion(googlebusinessinfo)
            } catch
            {
                print("googledata error \(error.localizedDescription)")
                let googebusinessinfoerror = error.localizedDescription
            }
        }
    }
    task.resume()
}

首先,如果在
解码
捕获块中打印
error
而不是
error.localizedDescription
,则可以极大地改进错误处理。前者显示了真正的错误,后者则是毫无意义的一般信息

要回答您的问题,请使用通用的
结果
类型

func getBusinessReviews(googleUrl: String, completion: @escaping (Result<WelcomeReview,Error>) -> ()) {
    // Create URL
    let url = URL(string: googleUrl)
    guard let requestUrl = url else { fatalError() }
    // Create URL Request
    var request = URLRequest(url: requestUrl)
    // Specify HTTP Method to use
    request.httpMethod = "GET"
    //Set HTTP Header

    // Send HTTP Request
    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
        // Specify HTTP Method to use
        request.httpMethod = "GET"
        print("(Google)Do we have any data: \(String(describing: data))")
        // Check if Error took place
        if let error = error {
            print("Error took place \(error)")
            completion(.failure(error))
            return
        }

        // Read HTTP Response Status code
        if let response = response as? HTTPURLResponse {
            print("(Google)Response HTTP Status code: \(response.statusCode)")
        }

        // Convert HTTP Response Data to a simple String
        if let data = data, let dataString = String(data: data, encoding: .utf8) {
            print("Googledata Response data string:\n \(dataString)")
        
            do {
                let googlebusinessinfo = try JSONDecoder().decode(WelcomeReview.self, from: data)
                print("googledata \(googlebusinessinfo)")
                completion(.success(googlebusinessinfo))
            } catch
            {
                print("googledata error:", error)
                let googebusinessinfoerror = error.localizedDescription
                completion(.failure(error))
            }
        }
    }
    task.resume()
}

谢谢@vadian,我真的很感谢你的提示和帮助。当我使用
.success
.failure
时,我得到一个错误,
无法根据成员“success\failure”推断上下文基础。我需要在某个地方建立这个吗?您是否也更改了完成处理程序的类型
(Result)->()
?啊,就是这样!再次感谢你!
getBusinessReviews(googleUrl: "Foo") { result in
    switch result {
        case .success(let info): print(info)
        case .failure(let error): print(error)
    }
}