gpt4 book ai didi

swift - Swift 中的 `nonisolated` 关键字是什么?

转载 作者:行者123 更新时间:2023-12-03 08:10:41 27 4
gpt4 key购买 nike

我最近在 Swift 中的以下代码中发现了 nonisolated 关键字:

actor BankAccount {

init(balance: Double) {
self.balance = balance
}

private var balance: Double

nonisolated func availableCountries() -> [String] {
return ["US", "CA", "NL"]
}

func increaseBalance(by amount: Double) {
self.balance += amount
}

}

它有什么作用?无论有没有它,代码都可以编译。

最佳答案

nonisolated 关键字是在 SE-313 中引入的。它用于向编译器指示方法内的代码未访问(读取或写入)参与者内的任何可变状态。这反过来又使我们能够从非异步上下文中调用该方法。

availableCountries() 方法可以设为非隔离,因为它不依赖于 Actor 内部的任何可变状态(例如,它不依赖于余额变量)。

当您从 Actor 外部访问 Actor 的不同方法或变量时,您只能从异步上下文内部执行此操作。

让我们从 availableCountries() 方法中删除 nonisolated 关键字。现在,如果我们想使用该方法,则只能在异步上下文中这样做。例如,在 Task 内:

let bankAccount = BankAccount(balance: 1000)

override func viewDidLoad() {
super.viewDidLoad()

Task {

let availableCountries = await bankAccount.availableCountries()
print(availableCountries)

}

}

如果我们尝试在异步上下文之外使用该方法,编译器会给出错误:

Compiler Error

但是,availableCountries() 并未使用参与者的任何可变状态。因此,我们可以使其非隔离,只有这样我们才能从非异步上下文中调用它(并且编译器不会打扰)。

enter image description here

关于swift - Swift 中的 `nonisolated` 关键字是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70941555/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com