Swift参数包与Sendable:捕获非Sendable类型警告问题排查
Swift泛型可变参数的Sendable约束未被编译器识别,触发非Sendable警告
以下Swift代码中,已对泛型参数each U添加Sendable约束,但编译器仍触发非Sendable类型警告:
func pack<each U: Sendable>(arg: repeat each U, function: @escaping @Sendable (repeat each U) -> Void) { Task { @MainActor in function(repeat each arg) } }
警告信息:
在@Sendable闭包中捕获了类型为'repeat each U'的非Sendable类型'arg'
这是Swift编译器的Bug,并非代码使用有误。当前Swift版本对泛型可变参数(repeat each语法)的Sendable推断支持不完善,即便已为每个泛型参数U指定Sendable约束,编译器也无法正确识别repeat each U整体符合Sendable协议,进而在闭包捕获时误判类型非Sendable。
可以通过将可变参数打包为元组的方式临时规避这个问题,元组的Sendable合规性会基于元素的Sendable约束被正确推断:
func pack<each U: Sendable>(arg: repeat each U, function: @escaping @Sendable (repeat each U) -> Void) { // 将可变参数打包为元组,让编译器正确识别其Sendable属性 let args = (repeat each arg) Task { @MainActor in function(repeat each args) } }
内容的提问来源于stack exchange,提问作者Sergey A. Novitsky
相关产品推荐
相关产品推荐

