将具有通用类签名的具体类型转换为swift

问题描述 投票:0回答:1

我有这样的struct

struct ApiResponse<T: Codable>: Codable {
 let result: T?
 let statusCode: String?
}

在我的代码中的某个地方,我需要statusCode。我对result不感兴趣,但是Swift不允许我使用以下代码:

let apiResponse = value as? ApiResponse

它显示以下错误:

无法将通用参数'T'强制转换为'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
        }

    }
ios swift generics codable
1个回答
0
投票

我建议添加一个新协议

protocol StatusCodeProvider {
    var statusCode: String? { get }
}

作为功能中的要求添加,以确保T中的NetworkResult<T>符合StatusCodeProvider并为要请求的每个T添加符合性。

© www.soinside.com 2019 - 2024. All rights reserved.