我在 Swift 5.5 中遇到了问题,但并不真正理解解决方案。
import Foundation
func testAsync() async {
var animal = "Dog"
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
animal = "Cat"
print(animal)
}
print(animal)
}
Task {
await testAsync()
}
这段代码出错了。
Mutation of captured var 'animal' in concurrently-executing code
然而,如果将animal
变量从此异步函数的上下文中移开,
import Foundation
var animal = "Dog"
func testAsync() async {
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
animal = "Cat"
print(animal)
}
print(animal)
}
Task {
await testAsync()
}
代码将会编译通过。我知道这个错误是为了防止数据竞争,但是为什么移动变量可以让它变得安全呢?