我是 Swift 新手,在 Xcode Playgrounds 中遇到了 Actor 隔离问题。当我尝试运行以下简单代码时,收到有关参与者隔离的错误消息,但我不确定为什么。
error: Testone.xcplaygroundpage:7:35: main actor-isolated var 'connectionSuccess' can not be referenced from a nonisolated context
if let newConnectionSuccess = connectionSuccess {
^
Testone.xcplaygroundpage:4:5: note: var declared here
var connectionSuccess: Bool? = nil
^
Testone.xcplaygroundpage:6:6: note: add '@MainActor' to make global function 'checkConnection()' part of global actor 'MainActor'
func checkConnection() -> Bool {
^
@MainActor
代码 Swift v6.0 和 Xcode v16
import Foundation
var connectionSuccess: Bool? = nil
func checkConnection() -> Bool {
if let newConnectionSuccess = connectionSuccess {
return newConnectionSuccess
}
return false
}
checkConnection()
我没有使用线程或做任何复杂的事情,只是想检查可选 Bool 的值。该错误建议添加 @MainActor,但我在教程中看到过类似的代码,但没有此要求。这是 Swift 中的新东西吗?感谢您对此的帮助。
这是 Swift 中的新东西吗?
有点?现在,在 Swift 6 中,完整的并发检查是强制,而之前您需要使用
-strict-concurrency=complete
选项来选择加入。
这里的问题是
connectionSuccess
隐式地与主要参与者隔离,因为它是在顶层声明的变量,允许语句(例如在 Playground/Swift 脚本/main.swift 等中)。
checkConnection
没有与主要 Actor 隔离(它没有与任何 Actor 隔离),因此无法同步访问 connectionSuccess
。
因此,您应该按照错误提示将
@MainActor
添加到 checkConnection
。
您可以通过进入 .playground 文件夹并找到contents.xcplayground 文件来降低 Playground 的 Swift 版本。看起来像这样
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<playground version='7.0' target-platform='macos' swift-version='6' buildActiveScheme='true' importAppTypes='true'/>
只需将
swift-version='6'
部分更改为您想要的 Swift 版本即可。