gpt4 book ai didi

ios - 将具体实例传递给需要协议(protocol)参数的闭包

转载 作者:行者123 更新时间:2023-12-01 21:29:44 25 4
gpt4 key购买 nike

在我的应用程序中,我有一个函数可以调用我的特定 API 端点,并且该函数接受一个闭包作为完成处理程序。该闭包接受 Result我的习惯DecodableCategory 中键入 ( success )案例和 Errorfailure案子。总而言之,它的方法签名如下所示:

static func getAllRestaurantCategories(completion: @escaping (Result<[Category], Error>) -> Void) -> Void
此函数调用 Alamofire 以确定服务器支持的语言,然后获取所有可能的餐厅类别的列表。它是这样实现的:
static func getAllRestaurantCategories(completion: @escaping (Result<[Category], Error>) -> Void) -> Void{
API.localizedRequest(API.categories) { (request: DataRequest) in
request.responseDecodable(of: [Category].self) { (response: DataResponse<[Category], AFError>) in
completion(response.result)
}
}
}
但是,与 completion(response.result) 在线,我得到一个编译器错误,显示 Cannot convert value of type 'Result<[Category], AFError>' to expected argument type 'Result<[Category], Error>' .如果我将方法接受的闭包更改为接受 AFError,此错误就会消失。在 failure情况,像这样:
static func getAllRestaurantCategories(completion: @escaping (Result<[Category], AFError>) -> Void) -> Void{
API.localizedRequest(API.categories) { (request: DataRequest) in
request.responseDecodable(of: [Category].self) { (response: DataResponse<[Category], AFError>) in
completion(response.result)
}
}
}
Alamofire 的 AFError符合 Error ,所以在我看来,这应该可以正常工作。我知道我可以解析 Alamofire 的 Result我自己并生成我自己的传递给我的完成处理程序,但如果我不需要,我宁愿不编写所有额外的自定义代码。我怎样才能让类型系统理解这应该没问题?

最佳答案

简单地说,在(至少是当前版本的)Swift 中,如果 SubBase 的子类型,这并不意味着 Container<Sub>Container<Base> 的子类型.
事实上,Container<Sub>Container<Base>是不相关的类型。
因此,虽然我们可以执行以下操作:

protocol Car {}
struct Toyota: Car {}

let a: Car = Toyota()
但我们通常不能(Swift 的标准库集合类型除外)这样做:
struct Container<T> {}

let c: Container<Car> = Container<Toyota>() // ERROR
据说 Container<Car>Container<Toyota>不是协变的
Result有一个 mapError应该使它相当轻松的功能:
completion(response.result.mapError { $0 as Error } )

关于ios - 将具体实例传递给需要协议(protocol)参数的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63098021/

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