简单 Swift 代码的 Xcode Playground 中出现主要 Actor 隔离错误

问题描述 投票:0回答:1

我是 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 中的新东西吗?感谢您对此的帮助。

ios swift xcode swift-playground
1个回答
0
投票

这是 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 版本即可。

© www.soinside.com 2019 - 2024. All rights reserved.