我有以下运行良好的代码:
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 的核心部分,您不能选择退出它们。一般来说,更严格的检查表明在没有明确标记的情况下应应用哪些默认值。但是,如果明确标记了类型、函数或协议,则您不能通过更改构建设置来忽略它。如果协议需要
@MainActor
,那么符合类型也必须强制执行。
改变的不是 Swift 改变了,而是 UIKit 和 Foundation 添加了额外的注释。所以你需要和他们打交道。