如何为Wrapped为泛型Task的Optional类型编写扩展并使用其底层类型?
为包装泛型Task的Optional编写扩展并访问Task底层类型
核心需求
能否为Optional类型编写扩展,使其Wrapped类型为泛型结构体Task,并在扩展内部使用Task的底层关联类型?
最初尝试(无法运行)
需要的是参数化扩展,而非在普通Optional扩展内定义泛型方法,但以下代码报错:Cannot find type 'E' in scope
extension Optional where Wrapped == Task<T, E> { }
更新1:限定Task类型但无法访问关联类型
尝试限定Wrapped为Task<Sendable, Error>,但无法获取被包装Task的底层类型来构造方法,报错:'Success' is not a member type of type 'Wrapped'
extension Optional where Wrapped == Task<Sendable, Error> { func value(or operation: @escaping @Sendable () async -> Wrapped.Success) async throws { let task: Task<Wrapped.Success, Wrapped.Failure> } }
更新2:具体实现示例及类型不匹配报错
以下代码尝试实现一个方法,当Optional包含Task时复用该Task,否则执行传入的异步操作创建新Task,但在赋值已有Task时出现类型不匹配错误:Cannot assign value of type 'Task<any Sendable, any Error>' to type 'Task<Success, any Error>'
extension Optional where Wrapped == Task<Sendable, Error> { func value<Success: Sendable>(or operation: @escaping @Sendable () async throws -> Success) async throws -> Success { let task: Task<Success, Error> switch self { case let .some(runningTask): task = runningTask // 报错位置 case .none: task = Task { return try await operation() } } return try await task.value } }
内容的提问来源于stack exchange,提问作者bodich
相关产品推荐
相关产品推荐

