在 XCode 中将 Swift 6 设置为语言版本后,我在代码中的几个地方使用 Task 关闭时收到此错误。
Passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure
以下是最低限度可重现的示例代码。
import Foundation
final class Recorder {
var writer = Writer()
func startRecording() {
Task {
await writer.startRecording()
print("started recording")
}
}
func stopRecording() {
Task {
await writer.stopRecording()
print("stopped recording")
}
}
}
actor Writer {
var isRecording = false
func startRecording() {
isRecording = true
}
func stopRecording() {
isRecording = false
}
}
编译器的错误不会带来太多有关真实错误的信息。考虑这行代码
await writer.startRecording()
,实际上self
是隐含的,所以这段代码实际上是await self.writer.startRecording()
。现在我们可以看到错误发生是因为
Recorder
不符合Sendable
所以无法通过的闭包捕获Task
。您可以通过使其
Recorder
符合来解决您的问题Sendable
。writer
另一个修复方法是在任务中捕获,closure
因为默认情况下Actor
符合Sendable
。