Search code examples
swiftswiftuiswift5swift-concurrency

Converting non-sendable function value may introduce data races


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?


Solution

  • 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.