Swift 5.10 内置于 Xcode 15.3,这应该是 Swift 6 之前的最后一个小版本,因此新特性不多。
废弃@UIApplicationMain与@NSApplicationMain
@UIApplicationMain
与@NSApplicationMain
曾经是 iOS 与 macOS App 的程序入口,Swift 5.3 之后引入了@main
作为新的程序入口。Swift 5.10 之后它们被正式废弃。
// Swift5.10之后废弃
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
}
// Swift5.10之后使用
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
}
在通用上下文中允许协议嵌套
Swift 5.10 之前,协议必须是顶级类型,但 Swift 5.10 之后,允许协议嵌套使用。
代码语言:javascript复制// 嵌套在非泛型函数与闭包中
func doSomething() {
protocol someProtocol {
func method()
}
}
// 嵌套在类中
class TableView {
protocol Delegate: AnyObject {
func tableView(_: TableView, didSelectRowAtIndex: Int)
}
}
class Delegate: TableView.Delegate {
func tableView(_: TableView, didSelectRowAtIndex: Int) {
}
}
并发编程
- 增强的并发检查:Swift 5.10 之后,编译器将正确标记所有并发编程中的不安全的代码,并且会给出提示。
@MainActor
class MyModel {
init() {
MainActor.assertIsolated()
}
static let shared = MyModel()
}
func usedShared() async {
// 警告:Expression is 'async' but is not marked with 'await'
let model = MyModel.shared
// let model = await MyModel.shared // 正确
}
- 全局变量的严格并发:Swift 5.10 之后,进一步增强了防止数据竞争的能力。
// 警告:var 'mutableGlobal' is not concurrency-safe because it is non-isolated global shared mutable state
var mutableGlobal = 1
@MainActor func mutateGlobalFromMain() {
mutableGlobal = 1
}
nonisolated func mutateGlobalFromNonisolated() async {
mutableGlobal = 10
}