Swift 5.9 感觉有点东西,除了宏之外还有一个亮点是可以和 C++互调用,甚至支持智能指针

WWDC23 的 Session 列表已经出来了 https://developer.apple.com/videos/wwdc2023/ 。宏和 SwiftData 看起来很有趣,解决了一些以前用 Swift 写 data model 时的痛点。此外还有一个我很感兴趣的就是和 C++ 的 interop ,明天会出一个专门的 Session 10172 - Mix Swift and C++ 讲解。在今天已经出的 What's new in Swift 视频中,我们可以粗略了解这一特性。

无需手写 Bridging 代码即可双向调用

根据视频中的演示,Swift 和 C++ 的 bridging header 由 Swift 编译器自动生成,并支持大部分 Swift 特性。

截屏 2023-06-07 14.25.43.png

双方的类型和方法都可以直接互相调用。

截屏 2023-06-07 14.26.14.png

IMG_3885.PNG

支持混写,在 CMake 项目里可以直接生成 target

这个操作我是完全没想到,Swift 社区真的很努力。顺带一提 Foundation 也正在逐步重写,用纯 Swift 取代历史遗留的 Objective-C 部分,性能也有所提升。未来 macOS 的标准库代码会和其他平台上的统一。

IMG_3882.PNG

支持 C++ 智能指针

跨语言的内存管理往往很麻烦。由于 Swift 和 C++ 都支持 RAII ,因此引用计数也可以跨语言,内存管理容易很多。Swift 5.9 还添加了 ~Copyable 协议,对应 unique_ptr 。在使用现代 C++ 的前提下,内存安全也有一定程度的保证。

IMG_3892.JPEG

个人理解和感受

  • 用 Swift 可以把 C++ 代码封装成更清晰友好,同时支持异步的 API 。C++ coroutine 的进展还比较缓慢,大多数项目的异步实现都是各用各的。而 Swift 在语言层面拥有灵活的异步抽象,包括 continuation, Task 和 actor 等等。用 Swift 的 async API 可以实现它们的统一调度。

  • 可能会利好游戏在苹果平台的开发。游戏往往都在用 C++ 开发,现在和原生可以更方便地交互了,移植体验会改善( Metal 不好用的话还是抓瞎)。

  • 欢迎各位在 Linux / Windows 平台也体验一下 Swift ,参与 Swift org 社区的讨论!