Tenho uma classe MyUIClass
que é @MainActor
isolada:
@MainActor
class MyUIClass {
func show(object: Any?) {}
}
Para usar a show
função, ela precisa ser acessada dentro do MainActor
contexto:
class Santa {
@MainActor
func present1(gift: Any?) {
MyUIClass().show(object: gift) // ✅
}
func present2(gift: Any?) {
Task { @MainActor in
MyUIClass().show(object: gift) // 💥 Task or actor isolated value cannot be sent; this is an error in the Swift 6 language mode."
}
}
}
O que não entendo é que quando tento usar gift
dentro do Task
bloco em present2
, recebo o aviso
O valor isolado da tarefa ou do ator não pode ser enviado; isso é um erro no modo de linguagem Swift 6.
Na primeira função, present1
, o argumento gift: Any?
não é isolado para MainActor
(certo?) e não é Sendable
, mas não há erro. No entanto, o erro só ocorre no segundo caso, dentro do Task
bloco.
Eu sei que o título é um pouco estranho. Eu entendo que @MainActor
funções só podem ser executadas no MainActor
contexto, e Task { @MainActor in }
podem ser executadas em qualquer contexto.
Ainda assim, nesses dois casos ( present1 / present2
), parece que MyUIClass().show(object: gift)
é executado no MainActor
contexto, então por que há uma diferença no comportamento do erro?
A
@MainActor
anotação deve, de fato, ser lida posicionalmente - ela afeta o que vem depois dela, o que, na sua primeira função, é a totalidade da função, incluindo seus parâmetros, e na sua segunda, é apenas o que acontece entre{ }
osTask
.Portanto, no primeiro exemplo,
gift
já estáMainActor
isolado e nada precisa cruzar o limite do ator.No segundo exemplo, entretanto,
gift
não éMainActor
isolado e, como também não éSendable
, não pode cruzar o limite, resultando em um erro de compilação.Só para ilustrar melhor, isso seria compilado perfeitamente:
Então seria isso...
... porque
String
éSendable
.