You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建以泛型结构体URLSessionUpload为值的字典?

解决泛型结构体字典定义问题

你的问题核心在于URLSessionUpload是泛型结构体,必须指定具体的泛型参数T才能作为字典的value类型。根据你的业务场景,有两种解决方案:


场景1:所有上传任务的T类型统一

如果你的所有上传操作对应的解码类型是同一个,直接明确指定泛型参数即可:

// 把MyDecodableModel替换成你实际使用的Decodable类型
private var _activeUploads = [URL: URLSessionUpload<MyDecodableModel>]()

场景2:上传任务的T类型不固定

如果需要存储不同T类型的上传实例,就得通过类型擦除来统一类型接口:

步骤1:定义非泛型协议

创建一个包含泛型结构体公共属性的非泛型协议,作为统一的类型入口:

protocol AnyURLSessionUpload {
    var url: URL { get }
    var session: URLSession { get }
    var task: URLSessionUploadTask { get }
}

步骤2:让泛型结构体遵循协议

修改你的URLSessionUpload结构体,使其遵循上述协议:

struct URLSessionUpload<T>: AnyURLSessionUpload where T: Decodable {
    let url: URL
    let session: URLSession
    let task: URLSessionUploadTask
    let promise: Promise<T>
}

步骤3:定义字典

现在字典可以用协议类型作为value,实现不同泛型实例的存储:

private var _activeUploads = [URL: AnyURLSessionUpload]()

后续如果需要访问特定T类型的promise属性,可以通过类型转换(比如instance as? URLSessionUpload<SpecificType>)来获取,兼顾类型安全和存储灵活性。

内容的提问来源于stack exchange,提问作者BadmintonCat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 12:36:16