Swift 6.2 新特性

Swift 6.2 内置于 Xcode 26,主要带来了如下的新特性。

标识符

显著扩展了创建标识符的字符范围,当使用``时,可以更随性。

swift 复制代码
func `this is a function`(param: String) -> String {
    return "Hello, \(param)"
}

enum HTTPStatus: String {
    case `200` = "Success"
    case `404` = "Not Found"
    case `500` = "Internal Server Error"
}

字符串插值支持默认值

字符串插值,可以设置默认值。当插值为可选型并且其值为nil时,可以使用提供的默认值。

swift 复制代码
var name: String? = nil
// Swift6.2之前
print("Hello, \(name ?? "zhangsan")!")
// Swift6.2之后
print("Hello, \(name, default: "zhangsan")!")

InlineArray

引入了一种新的数组类型,表示固定大小的数组,性能优越。

swift 复制代码
var array: InlineArray<3, String> = ["zhangsan", "lisi", "wangwu"]
var array2: InlineArray = ["zhangsan", "lisi", "wangwu"]

enumerated()返回的类型遵守Collection

进一步简化了在 SwiftUI 中的使用。

swift 复制代码
import SwiftUI

struct ContentView: View {
    @State private var names = ["ZhangSan", "LiSi", "WangWu"]

    var body: some View {
        // Swift6.2之前
        List(Array(names.enumerated()), id: \.element) { turple in
            HStack {
                Text("\(turple.offset)")
                
                Text(turple.element)
            }
        }
        // Swift6.2之后
        List(names.enumerated(), id: \.element) { turple in
            HStack {
                Text("\(turple.offset)")
                
                Text(turple.element)
            }
        }
    }
}

weak let

  • 引入了weak let,允许声明不可变的弱引用属性。
  • 解决 Sendable 类型中弱引用的问题。
swift 复制代码
import UIKit

class ViewController: UIViewController {
    // Swift6.2之前
    @IBOutlet weak var redView: UIView!
    // Swift6.2之后
    @IBOutlet weak let greenView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

    }
}

Backtrace

引入了一个新的结构体,提供运行时堆栈追踪,可以捕获从当前代码处到调用处的函数调用序列。

swift 复制代码
import Runtime

func functionOne() {
    do {
        if let frames = try? Backtrace.capture().symbolicated()?.frames {
            print(frames)
        }
        else {
            print("Failed to capture backtrace.")
        }
    } catch {
        print(error.localizedDescription)
    }
}

func functionTwo() {
    functionOne()
}

func functionThree() {
    functionTwo()
}

functionThree()

并发编程

  • 在 Swift 6.2 之前,nonisolated 异步函数会自动在后台线程执行。但在 Swift 6.2 之后,nonisolated 异步函数将会在调用者的 actor 上执行。此时通过@concurrent进行修饰,可以继续让其按照之前的方式运行。
  • 当使用@concurrent时,函数会发生以下行为。
    • 将在后台线程运行,即使从主线程调用。
    • 创建一个新的隔离,与调用者分离。
    • 所有参数和返回值必须符合 Sendable 协议。
  • 适用场景。
    • 函数执行时间较长。
    • 函数是 CPU 密集型或者可能阻塞线程,比如大量的数据转换,I/O 操作等。
swift 复制代码
actor SomeActor {
  // 不允许
  @concurrent
  func doSomething() async throws {
  }

  // 允许
  @concurrent
  nonisolated func doAnotherthing() async throws {
  }
}
相关推荐
茶底世界之下2 天前
时间线效果层,为什么不能只复用一个处理器?
ios·swift
Cc.Y2 天前
Swift深度链接的极简之道
ios·cocoa·swift
传奇开心果编程2 天前
【SwiftUI提高练中学】第9课 安全与隐私
swiftui·移动开发·swift·编程语言理论·开发范式·编程框架·声明式ui
茶底世界之下3 天前
动态切换 nearest / linear 时,为什么不能只替换 sampler
ios·swift
应用市场3 天前
把旧 Pixel 变成相册备份中转站(上):Mac 到安卓的照片传输工具设计——流式上传、sha256 校验、adb forward 与 Bonjour
android·macos·adb·kotlin·swift
传奇开心果编程3 天前
【声明式UI开发实用技术学与练】第8课 状态提升与下放
学习·flutter·react native·ui·swiftui·composer
东坡肘子3 天前
Swift Server,又多了一个 Google -- 肘子的 Swift 周报 #156
人工智能·swiftui·swift
打工仔折腾 AI4 天前
从零写一个CAD 05:以鼠标为中心的滚轮缩放,招法能复用但顺序不能反
开发语言·后端·python·性能优化·计算机外设·swift·ai agent 实战
传奇开心果编程4 天前
【现代声明式UI学与练】第4课 列表渲染与 key——如何高效渲染列表、key 的作用、列表重排时的状态保持
学习·flutter·react native·ui·swiftui·android jetpack
茶底世界之下4 天前
视频预览切换为何会闪回旧帧:用 generation + mode identity 管住异步回调
ios·swift