ios - 如何表示 nil Error Swift 完成 block

标签 ios swift xcode completion-block

嗨,我有一个 swift 中的 Web 服务工作对象,它将完成 block 传递给调用者 View Controller 。代码如下:

func getFlightData(for airportCode: String, minutesBehind:String, minutesAhead:String, completion: (([Flight], NSError) -> Void)?) {
    var urlComponents = URLComponents()
    urlComponents.scheme = "https"
    urlComponents.host = "xxxxxxx.com"
    urlComponents.path = "/1/airports/"+airportCode+"/flights/flightInfo"
    urlComponents.queryItems = [
        URLQueryItem(name: "city", value: airportCode),
        URLQueryItem(name: "minutesBehind", value: minutesBehind),
        URLQueryItem(name: "minutesAhead", value: minutesAhead)

    ]

    guard let url = urlComponents.url else { fatalError("Could not create URL from components") }
    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.setValue("xxxxxxxxx", forHTTPHeaderField: "Authorization")
    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)


    let task = session.dataTask(with: request) { (responseData, response, responseError) in
        DispatchQueue.main.async {


            if let error = responseError {

                //completion block???


            }

            else if let jsonData = responseData {

                let decoder = JSONDecoder()

                do {
                    let posts = try decoder.decode([Flight].self, from: jsonData)
                    //completion?(posts, nil) ???? what to pass for Error? Successful call
                } catch {
                    self.showError()

                }
            }

            else {
                //completion block???
                self.showError()
            }
        }
    }
    task.resume()
}

调用成功时,我在完成 block 中传递什么值错误参数。我不能通过 nil,因为 swift 不允许我这样做。有人可以建议一种更好的方法来进行此 API 调用吗?如何发送完成 block 等

最佳答案

将完成 block 声明为采用 Error? 而不是 NSError,然后您将能够将 nil 传递给它成功案例。 ? 使参数成为可选参数,这使得它可以包含 nil。 (另外,使用 Error 而不是 NSError,因为它是惯用的 Swift 错误类型)。

或者,您可以让完成 block 采用 Result 枚举,您可以如下定义:

public enum Result<T> {
    case success(T)
    case error(Error)

    public func unwrap() throws -> T {
        switch self {
        case let .success(ret):
            return ret
        case let .error(error):
            throw error
        }
    }
}

然后,您可以使用 .success.error 情况,具体取决于操作是成功还是失败。

关于ios - 如何表示 nil Error Swift 完成 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49544455/

相关文章:

ios - Xcode,无法读取包内容(错误域 = NSCocoaErrorDomain 代码 = 260

ios - 如何使用 Locksmith 保存和加载多个凭据?

ios - 如何让应用保持纵向模式

ios - 如何为 UIPickerView 添加边框?

ios - WKWebView 禁用快速缩放和编辑

iphone - 具有可拉伸(stretch)背景图像的 UITableViewCell

ios - 将 NSArray 传递到 tableview swift 3.0

json - Xcode:尝试读取 JSON 时无法打开 "loginUser"

swift - Swift 中的 BigInteger 等价物?

ios - Xcode中的swift语言版本build设置是什么意思?