Swift中为何非Sendable属性可在Task中修改且无报错?
为什么非Sendable类在Task中调用方法未触发报错?
你的代码没触发报错主要有这几个原因:
- Swift的并发安全检查默认是非强制宽松模式。只有开启「严格并发检查(Strict Concurrency Checking)」后,编译器才会严格校验跨Task/actor传递的类型是否遵循Sendable协议。默认设置下,这类非Sendable类型的跨Task引用不会触发编译错误。
- 代码中
Task捕获的是Tester实例的counter属性,本质是捕获了Counter类的引用。非final类默认不遵循Sendable,但编译器在宽松模式下不会主动对这类场景进行强制校验,除非你显式给类型添加Sendable约束,或者开启严格并发检查。 - 另外,
count += 1属于线程不安全的运行时问题,不属于编译阶段Sendable检查的范畴。Sendable检查只负责验证类型是否可以安全跨并发上下文传递,不会直接检测具体操作的线程安全性。
如果想要让编译器检测到这个问题,你可以:
- 在项目Build Settings中,把「Strict Concurrency Checking」设置为
Complete - 或者在单个Swift文件顶部添加编译标记:
// swiftc -Xfrontend -strict-concurrency=complete
开启严格检查后,编译器会提示Counter类未遵循Sendable协议,同时指出在Task中捕获非Sendable类型引用的并发风险。
内容的提问来源于stack exchange,提问作者rayaantaneja
相关产品推荐
相关产品推荐

