如何创建以泛型结构体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
相关产品推荐
相关产品推荐

