【问题标题】:Swift - Cannot specialize a non-generic definition using Result<T, Error>Swift - 无法使用 Result<T, Error> 专门化非泛型定义
【发布时间】:2019-03-28 20:10:43
【问题描述】:

尝试使用最新的 Swift 5.0 Result 类。做了一个通用函数,它可以构建。但是调用它不会编译。这有不同的语法吗? XCode 不在这里提出建议。

private func buildTask<T: Decodable>(request:URLRequest, handler: @escaping (Result<T, NetworkError>) -> Void) -> URLSessionDataTask {
    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
        // logic here....
        let decoder = JSONDecoder()
        if let data = data, let decodedResponse = try? decoder.decode(T.self, from: data) {
            handler(.success(decodedResponse))
        } else {
            handler(.failure(.errorParsing))
        }
    }
    return task
}

// calling method, Compile error here about generic
func test() {
    let url:URL = URL(string: "http://google.com")!
    let request:URLRequest = URLRequest(url: url)
    let task = buildTask<String>(request: request) { (result) in
        switch result {
        case .success:
            print("good")
        case .failure:
            print("bad")
        }
    }
}

// 海报下方的解决方案。

let task = buildTask(request: request) { (result:Result<String, NetworkError>) in
            switch result {
            case .success(let success):
                print("success \(success)")
            case .failure(let error):
                print("error \(error)")
            }
        }

【问题讨论】:

  • 在你的test() 函数中你不应该调用buildTask(...) 而不是dataTask(...)吗?
  • 抱歉把它错误地粘贴到stackoverflow中。方法是对的。

标签: swift swift5


【解决方案1】:

在 Swift 中,您不能在调用时使用 &lt;T&gt; 指定泛型类型。泛型方法的类型是从您传递给它的类型中推断出来的。在这种情况下,来自handler 闭包:

let task = buildTask(request: request) { (result: Result<String, NetworkError>) in

当您指定result 的类型时,编译器可以推断出闭包的类型,进而推断出方法的泛型类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多