Swift 6严格并发检查:协议符合Sendable的疑问与实现
Swift 6并发检查:协议继承Sendable的约束说明
当你让FooProtocol继承Sendable时,核心要求是所有遵循该协议的具体类型必须符合Sendable规范,而非仅要求协议内的函数满足某种并发条件。
具体解释:
Sendable是Swift并发模型中用于标记类型可安全跨actor传递的约束。当协议继承Sendable,就相当于给所有遵循该协议的类型加上了强制要求:- 值类型(如结构体、枚举)默认符合
Sendable,只要其所有属性也符合Sendable; - 引用类型(如类)要么是
final且所有属性符合Sendable,要么必须显式添加@unchecked Sendable标记(需自行保证并发安全)。
- 值类型(如结构体、枚举)默认符合
- 回到你的例子:
Bar是Sendable结构体,它的foo属性为any FooProtocol类型。如果FooProtocol不继承Sendable,编译器无法确认这个抽象类型的实例是否能安全跨actor传递,因此触发警告。而让协议继承Sendable后,编译器会强制校验所有FooProtocol的遵循者是否符合Sendable,从而确保any FooProtocol实例满足并发安全要求,警告自然消除。
额外注意:
协议内函数的并发特性(比如async修饰)和Sendable是完全不同的概念:前者关注函数的调用方式是否支持异步,后者关注类型本身在并发环境下的传递安全性,二者没有直接关联。
内容的提问来源于stack exchange,提问作者squarefrog
相关产品推荐
相关产品推荐

