Swift 5.10 新特性

2024-06-12 08:29:51 浏览数 (3)

Swift 5.10 内置于 Xcode 15.3,这应该是 Swift 6 之前的最后一个小版本,因此新特性不多。

废弃@UIApplicationMain与@NSApplicationMain

@UIApplicationMain@NSApplicationMain曾经是 iOS 与 macOS App 的程序入口,Swift 5.3 之后引入了@main作为新的程序入口。Swift 5.10 之后它们被正式废弃。

代码语言:javascript复制
// 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 之后,编译器将正确标记所有并发编程中的不安全的代码,并且会给出提示。
代码语言:javascript复制
@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 之后,进一步增强了防止数据竞争的能力。
代码语言:javascript复制
// 警告: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
}

0 人点赞