转换在 class 签名 swift 中具有泛型的具体类型
Convert concrete type having generic in class signature swift
我有一个struct
这样的
struct ApiResponse<T: Codable>: Codable {
let result: T?
let statusCode: String?
}
我的代码中某处需要 statusCode
。我对 result
不感兴趣,但 Swift 不允许我使用以下内容:
let apiResponse = value as? ApiResponse
它显示以下错误:
Generic parameter 'T' could not be inferred in cast to 'ApiResponse'
这很明显,因为结构定义要求一些符合 Codable
的结构,但同时我不能使用一种类型,因为它对其他类型会失败。
例如
let apiResponse = value as? ApiResponse<ApiResult>
对于一种类型的响应是正确的,但如果我有 ApiResponse<ApiOtherResult>
,它将失败。
NetworkLayer.requestObject(router: router) { (result: NetworkResult<T>) in
switch result {
case .success(let value):
if let apiResponse = value as? ApiResponse {
}
case .failure: break
}
}
我建议添加一个新协议
protocol StatusCodeProvider {
var statusCode: String? { get }
}
将其作为一项要求添加到您的函数中,确保 NetworkResult<T>
中的 T
符合 StatusCodeProvider
并为您想要请求的每个 T
添加一致性。
我有一个struct
这样的
struct ApiResponse<T: Codable>: Codable {
let result: T?
let statusCode: String?
}
我的代码中某处需要 statusCode
。我对 result
不感兴趣,但 Swift 不允许我使用以下内容:
let apiResponse = value as? ApiResponse
它显示以下错误:
Generic parameter 'T' could not be inferred in cast to 'ApiResponse'
这很明显,因为结构定义要求一些符合 Codable
的结构,但同时我不能使用一种类型,因为它对其他类型会失败。
例如
let apiResponse = value as? ApiResponse<ApiResult>
对于一种类型的响应是正确的,但如果我有 ApiResponse<ApiOtherResult>
,它将失败。
NetworkLayer.requestObject(router: router) { (result: NetworkResult<T>) in
switch result {
case .success(let value):
if let apiResponse = value as? ApiResponse {
}
case .failure: break
}
}
我建议添加一个新协议
protocol StatusCodeProvider {
var statusCode: String? { get }
}
将其作为一项要求添加到您的函数中,确保 NetworkResult<T>
中的 T
符合 StatusCodeProvider
并为您想要请求的每个 T
添加一致性。