12

I have a simple piece of code:

struct ContentView: View {
    var body: some View {
        Text("Hello world!")
            .task {
                await myAsyncFunc()
            }
    }

    private func myAsyncFunc() async {}
}

This compiles completely fine. However, if I replace the task with this:

.task(myAsyncFunc)

It doesn't work, and gives me the error below:

Converting non-sendable function value to '@Sendable () async -> Void' may introduce data races

Why is this, and how can I fix it?

George
  • 25,988
  • 10
  • 79
  • 133

1 Answers1

10

As it states, the function can be marked as @Sendable. This is used to prevent data races.

Change it to this:

@Sendable private func myAsyncFunc() async {}

Note that the @Sendable must be before the access modifier.

George
  • 25,988
  • 10
  • 79
  • 133
  • 1
    `Main actor-isolated synchronous instance method '<#method#>' cannot be marked as '@Sendable'; this is an error in Swift 6` – amq Dec 06 '22 at 07:22