gpt4 book ai didi

ios - 无法将类型 '(Either) -> Void' 的值转换为预期的参数类型 '(Either<[_]>) -> Void'

转载 作者:搜寻专家 更新时间:2023-11-01 07:02:58 30 4
gpt4 key购买 nike

我正在尝试将 Codable 与协议(protocol)一起使用来处理 API 请求和响应。我正在查询的 API 以“结果”键下的一组项目作为响应:

{ results: ["id": "1", "id": "2"] }

因此,我希望构建一个嵌套的 Codable 类型。

从下面的代码来看,在完成处理程序中使用 Items 是可行的,但使用 NestedType 或 TestResponse 不起作用并返回以下错误:

Cannot convert value of type '(Either<NestedType>) -> Void' to expected argument type '(Either<[_]>) -> Void'

我不确定为什么这不起作用。尝试使用 Swift 4 和 Swift 4.1

import Foundation

enum Either<T> {
case success(T)
case error(Error)
}

enum APIError: Error {
case unknown, badResponse, jsonDecoder
}

protocol APIClient {
var session: URLSession { get }
func get<T: Codable>(with request: URLRequest, completion: @escaping (Either<[T]>) -> Void)
}

extension APIClient {

var session: URLSession {
return URLSession.shared
}

func get<T: Codable>(with request: URLRequest, completion: @escaping (Either<[T]>) -> Void) {

let task = session.dataTask(with: request) { (data, response, error) in
guard error == nil else {
completion(.error(error!))
return
}

guard let response = response as? HTTPURLResponse, 200..<300 ~= response.statusCode else {
completion(.error(APIError.badResponse))
return
}

guard let value = try? JSONDecoder().decode([T].self, from: data!) else {
completion(.error(APIError.jsonDecoder))
return
}

DispatchQueue.main.async {
completion(.success(value))
}
}
task.resume()
}
}

class TestClient: APIClient {

func fetch(with endpoint: TestEndpoint, completion: @escaping (Either<NestedType>) -> Void) {
let request = endpoint.request

print(request.allHTTPHeaderFields)

print("endpoint request", endpoint)

get(with: request, completion: completion)
}
}

typealias Items = [SingleItem]
typealias NestedType = TestResponse

struct TestResponse: Codable {
let result: [SingleItem]
}

struct SingleItem: Codable {
let id: String
}

最佳答案

你的 fetch方法的完成处理程序需要声明为采用 Either<[NestedType]> ,不是 Either<NestedType> ,因为你的 get方法需要一个带有 Either 的完成处理程序一个数组。

顺便说一句,你叫的类型Either ,我们通常称 Result .

关于ios - 无法将类型 '(Either<NestedType>) -> Void' 的值转换为预期的参数类型 '(Either<[_]>) -> Void',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50031336/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com