• Swift 6.2发布 解决了之前async/await使用中的一些痛点
  • 发布于 1小时前
  • 14 热度
    0 评论
前言
昨天刷 Swift.org 看到 Swift 6.2 发布了,看了下更新内容,并发编程地改进挺多的。最大的变化是默认单线程模式,还有一些性能优化地新类型。这个版本主要解决了之前 async/await 使用中地一些痛点。

并发编程改进
Swift 6.2 在并发编程上有几个改进:
1.单线程默认模式 - 开启 -default-isolation MainActor 后,代码默认在主线程执行,不用到处加 @MainActor
2.async 函数优化 - async 方法现在在调用者的执行上下文中运行,不会无缘无故切换线程
3.@concurrent 标记 - 明确标记需要并发执行的代码
来看个实际例子:
// 在 '-default-isolation MainActor' 模式下

struct Image {
// 图片缓存在主线程保护下,很安全
staticvar cachedImage: [URL: Image] = [:]

staticfunc create(from url: URL) async throws -> Image {
    iflet image = cachedImage[url] {
      return image
    }

    let image = try await fetchImage(at: url)

    cachedImage[url] = image
    return image
  }
// 用 @concurrent 标记需要并发执行的部分
  @concurrent
staticfunc fetchImage(at url: URL) async throws -> Image {
    let (data, _) = try await URLSession.shared.data(from: url)
    return await decode(data: data)
  }
}
这样可以避免数据竞争问题,并发代码更安全。

性能优化相关
Swift 6.2 增加了两个新类型,主要针对性能要求高的场景。
InlineArray
固定大小的数组,直接在栈上分配内存:
struct Game {
  // 40 个 Sprite,直接在结构体内部存储
  var bricks: [40 of Sprite]

  init(_ brickSprite: Sprite) {
    bricks = .init(repeating: brickSprite)
  }
}
适合需要大量小对象地场景,比如游戏开发。

Span
安全访问连续内存地类型,编译时检查内存安全,运行时无开销:
// 安全访问 C 风格数组
func processData(_ span: Span<UInt8>) {
  for byte in span {
    // 处理数据,编译器保证内存有效
  }
}
比 UnsafePointer 更安全。

Embedded Swift 支持更多特性
.完整的 String API
.class 协议的 any 类型

.InlineArray 和 Span 类型


开发工具更新
VS Code 扩展
Swift 官方认证的 VS Code 扩展现在支持:
.后台索引默认开启,代码跳转和补全飞快
.内置 LLDB 调试,直接在 VS Code 里断点调试
.Swift 项目面板,管理依赖和任务很方便

.DocC 文档实时预览


编译警告控制
支持按警告类型分组控制:
.target(
  name: "MyLibrary",
  swiftSettings: [
    .treatAllWarnings(as: .error),  // 所有警告当错误
    .treatWarning("DeprecatedDeclaration", as: .warning),  // 除了废弃API警告
  ]
)
Macro 编译优化
SwiftPM 支持预构建的 swift-syntax 依赖,编译速度提升明显。
async 调试改进
.async 单步调试更可靠
.显示任务上下文信息
支持任务命名
Task("下载图片") {
  let image = try await downloadImage()
  // 调试时能看到这是"下载图片"任务
}
核心库更新
Subprocess
新的进程管理 API:
import Subprocess
 // 堆代码 duidaima.com
let swiftPath = FilePath("/usr/bin/swift")
let result = try await run(
  .path(swiftPath),
  arguments: ["--version"]
)

let swiftVersion = result.standardOutput
这个框架之后有时间再详细介绍。

Foundation NotificationCenter
支持类型安全的通知:
// 定义通知类型
struct UserLoginNotification: MainActorMessage {
let username: String
let timestamp: Date
}

// 发送通知
NotificationCenter.default.post(UserLoginNotification(
  username: "john", 
  timestamp: Date()
))

// 接收通知 - 类型安全!
for await notification inNotificationCenter.default.notifications(for: UserLoginNotification.self) {
print("用户 \(notification.username) 登录了")
}
Swift Testing
测试框架新功能:
退出测试 - 测试程序终止的情况
附件支持 - 测试结果包含截图、日志等
简化测试命名
@Test func `square() returns x * x`() {
  #expect(square(4) == 4 * 4)
}
WebAssembly 支持
Swift 6.2 支持编译到 WebAssembly 了,可以在浏览器或其他 Wasm 运行时执行。

总结
Swift 6.2 主要改进了并发编程体验,新增了 InlineArray 和 Span 两个性能优化类型。VS Code 扩展的官方支持也比较实用。对于正在使用并发编程的项目,这次更新还是值得升级的。其中还有很多值得细聊的,以后有时间再详细介绍。
用户评论