使系统类型符合具有“@MainActor”隔离的协议,同时禁用并发检查会产生意外错误

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

我有以下运行良好的代码:

protocol URLLauncher {
  func open(_ url: URL, options: [UIApplication.OpenExternalURLOptionsKey: Any], completionHandler: ((Bool) -> Void)?)
}
extension UIApplication: URLLauncher {}

它在 Xcode 16 beta 1&2 上运行良好。当我更新到 Xcode 16 beta 3 时,它给我错误抱怨

completionHandler
应该是主角。这可以通过将
@MainActor
添加到
completionHandler
来解决:

...completionHandler: (@MainActor(Bool) -> Void)?)

但是,我还不想使用任何并发功能。奇怪的是 Xcode 甚至给了我这个错误,因为我没有在我的构建设置中启用并发检查。我禁用了所有

SWIFT_UPCOMING_FEATURES_6_0
,并将“严格并发检查”设置为“最小”,语言模式为 Swift 5(不是 swift 6)。

不确定我的代码是否有问题,或者是 Xcode 中的错误。

swift concurrency
1个回答
0
投票

各种并发功能是 Swift 的核心部分,您不能选择退出它们。一般来说,更严格的检查表明在没有明确标记的情况下应应用哪些默认值。但是,如果明确标记了类型、函数或协议,则您不能通过更改构建设置来忽略它。如果协议需要

@MainActor
,那么符合类型也必须强制执行。

改变的不是 Swift 改变了,而是 UIKit 和 Foundation 添加了额外的注释。所以你需要和他们打交道。

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