I find the benefit in explicitness... These two apps are seemingly "equivalent":
func foo1(execute: (Int) -> Void) {
bar1 { execute($0) }
}
func bar1(execute: (Int) -> Void) {
execute(42)
}
foo1 { print($0) }
and:
func foo2() async -> Int {
await bar2()
}
func bar2() async -> Int {
42
}
print(await foo2())
yet the first one uses one thread... and the second one – two.
Interestingly you said that, as for me the situation is quite the opposite – the infrastructure saved me from the obvious low-level data races, but that's that.. I wish we'll have something much better eventually that actually "forces" me to write correct code (making an incorrect code a compilation error or at least a runtime error). We are very far from that with the current async/await/actors state of affairs, I am afraid.