# 老司机 iOS 周报 #330 | 2025-04-07

![ios-weekly](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/weekly-header/330.jpg?raw=true)
老司机 iOS 周报，只为你呈现有价值的信息。

你也可以为这个项目出一份力，如果发现有价值的信息、文章、工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们，我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

## 新闻

### 🐕 [Swift 6.1 Released](https://www.swift.org/blog/swift-6.1-released/)

[@AidenRao](https://weibo.com/AidenRao)：Swift 6.1 正式推出，核心更新：

1. **并发优化**： `nonisolated` 支持类型和扩展，任务组子任务结果类型自动推断；
2. **OC 迁移：** 新增 `@implementation` 支持，允许在 Swift 中实现 Objective-C 类型，便于逐步迁移；
3. **开发体验**：尾随逗号支持扩展至参数列表、元组等场景；
4. **包管理**：新增 `package traits` 机制，适配跨平台条件编译；
5. **测试增强**：支持自定义测试前后逻辑，异常处理更便捷；
6. **文档工具**：Swift-DocC 优化符号链接可读性。

推荐通过 Xcode 16.3 或 `swiftly` 工具链安装体验。

## 新手推荐

### 🐕 [Modern URL construction in Swift](https://www.swiftbysundell.com/articles/modern-url-construction-in-swift/)

[@阿权](https://github.com/bqlin)：本文介绍了 Swift 在 URL 构建方面的现代解决方案，通过类型扩展、宏和新 API 的结合，实现了更安全、简洁的 URL 处理方式。开发者可根据项目需求选择合适方案，提升代码质量。具体内容为：

1. 静态字符串构建 URL 使用 Optional 方式显得冗余，应直接强制解包。
   1. 解法 1：添加 URL 扩展直接创建 URL 实例，内部解包为空时 fatallError，输出信息。
   2. 解法 2：通过自定义宏创建 URL 实例，实现解包并抛出错误的逻辑。
2. 对于动态构建的 URL，应使用更结构的 URL、URLComponents 拼接、构建方法，甚至能够直接获取本地常见目录的 URL。

## 文章

### 🐕 [Deploying a Swift Server App to Fly.io and Railway](https://swifttoolkit.dev/posts/deploy-fly-railway)

[@Kyle-Ye](https://github.com/Kyle-Ye): 本文介绍了如何使用 Vapor 框架部署 Swift 服务端应用程序到 Fly.io 和 Railway 平台。文章涵盖了初始化 Vapor 项目、编写 Dockerfile、以及在两个平台上部署应用的具体步骤。此外 , 还提到了一些进阶主题 , 如自定义域名和添加数据库服务等。

### 🐢 AI 产品经理进阶：万字深析大模型的 MCP（[上](https://www.woshipm.com/ai/6190336.html) & [下](https://www.woshipm.com/ai/6190355.html)）

[@EyreFree](https://github.com/EyreFree)：这篇文章深度剖析了大模型的 MCP 技术。MCP 是 Anthropic 于 2024 年底开源的开放标准协议，旨在统一 AI 与外部数据源和工具的连接方式，降低集成成本。它采用客户端 - 服务器架构，基于 JSON-RPC 2.0 通信，定义多种原语规范交互。该技术已在智能问答、编程辅助、办公自动化等场景崭露头角。文章还全面分析了 MCP 的优势与局限，如标准统一、开源灵活，但也存在生态不完善、远程支持不足等问题。此外，还展望了其未来在完善远程云支持、构建 “应用商店” 式分发机制、拓展多模态应用等方面的演进方向，为 AI 从业者或对之感兴趣的同学提供了极具价值的参考。

### 🐕 [Fast & Fluid: Integrating Rust egui into SwiftUI](https://medium.com/@djalex566/fast-fluid-integrating-rust-egui-into-swiftui-30a218c502c1)

[@david-clang](https://github.com/david-clang)：作者在开发实时预览 SwiftData 和 CoreData 数据库的 Mac App [DataScout](https://apps.apple.com/us/app/datascout-for-sqlite-swiftdata/id6737813684) 时，发现 SwiftUI 的 `Table` 性能相当差，尝试用 AppKit 的 `NSTableView` 也无法满足需求，最后用 Rust 的 UI 框架 `egui` 去优化性能。作者把 SwiftUI 中嵌入 `egui` 渲染视图的 Demo 整理成文章，还用代码示例展示如何在 SwiftUI 的 `NavigationSplitView` 中嵌入 `egui` 渲染的视图。以下是 `egui` 和传统 UI 框架的对比：

- 传统 UI 框架（如 SwiftUI、UIKit）多采用**保留模式（Retained Mode）**，需显式管理 UI 组件状态（例如按钮状态、列表数据等），框架内部通过对比新旧状态差异来局部更新界面。
- `egui` 的**即时模式（Immediate Mode）** 则相反：**每帧完全丢弃旧 UI 状态**，根据当前数据重新生成整个界面，通过高频重建实现“无状态化”。

虽然 Demo 中使用 `egui_wgpu_backend` 作为渲染后端，但它在 Metal 上渲染单帧需要 10 毫秒，作者在开发 [DataScout](https://apps.apple.com/us/app/datascout-for-sqlite-swiftdata/id6737813684) 时，通过自定义渲染后端，把帧渲染时间缩短到仅 1-2 毫秒，最终才实现高性能需求，可见把 “ SwiftUI 中嵌入 `egui` 渲染视图” 封装成成熟框架会比较难，但本文优化 SwiftUI 性能的思路值得我们学习。

### 🐎 [得物 iOS 启动优化之 Building Closure](https://mp.weixin.qq.com/s/xr43Xx-A3NT8lPGIii8pPA)

[@Smallfly](https://github.com/iostalks)：本文深入解析了 iOS 应用启动优化中常被忽视的 **Building Closure** 阶段（由 dyld 动态链接器负责），聚焦其耗时问题与优化实践。文章通过真实案例，揭示了某版本因 Building Closure 阶段耗时暴增 200ms 的根因定位过程，并最终通过 解决**Perfect Hash 算法**的哈希冲突，将关键函数耗时从 1200ms 降至 110ms。

文中详细剖析了 Building Closure 的工作原理（如首次启动生成缓存、Swift/ObjC 协议一致性处理），并提供了 **文件结构解析、耗时定位方法（Instrument 工具）及优化方案**，适合以下读者参考： 
1. **iOS 开发工程师**：需优化应用启动速度，尤其是冷启动场景； 
2. **性能调优团队**：关注底层 dyld 机制，探索启动耗时优化新方向； 
3. **技术管理者**：了解复杂问题排查流程与跨团队协作经验。

## 内推

重新开始更新「iOS 靠谱内推专题」，整理了最近明确在招人的岗位，供大家参考

具体信息请移步：https://www.yuque.com/iosalliance/article/bhutav 进行查看（如有招聘需求请联系 iTDriverr）

## 关注我们

我们是「老司机技术周报」，一个持续追求精品 iOS 内容的技术公众号，欢迎关注。

**关注有礼，关注【老司机技术周报】，回复「2024」，领取 2024 及往年内参**

![](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/qrcode_for_wechat.jpg?raw=true)

同时也支持了 RSS 订阅：https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。

## 说明

🚧 表示需某工具，🌟 表示编辑推荐

预计阅读时间：🐎 很快就能读完（1 - 10 mins）；🐕 中等 （10 - 20 mins）；🐢 慢（20+ mins）
