Estou recebendo esse erro em alguns lugares no meu código com o encerramento de tarefa após definir Swift 6 como versão de linguagem no XCode.
Passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure
Abaixo está um código de exemplo minimamente reproduzível.
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
}
}
O erro do compilador não traz muita informação sobre o erro real. Considere esta linha de código
await writer.startRecording()
, na verdadeself
está implícita, então este código é na verdadeawait self.writer.startRecording()
.Agora podemos ver que o erro ocorre porque
Recorder
não está em conformidade,Sendable
portanto não pode ser capturado pelo fechamento deTask
.Você pode resolver seu problema fazendo
Recorder
conformeSendable
.Outra correção é capturar
writer
na Tarefa,closure
poisActor
isso é feitoSendable
por padrão.