在 weekly.fatbobman.com[1]订阅本周报的电子邮件版本。访问我的博客 肘子的 Swift 记事本[2]查看更多的文章。加入 Discord[3]社区,与 2000+ 中文开发者深入交流 Swift、SwiftUI 开发体验。
不知不觉,距离 WWDC 2025 开始只有 20 天了。在过去的几年中,每当此时我都会写几篇文章畅想 WWDC 上会带来的新功能和我期待的一些变化。
然而,或许是因为最近两年 WWDC 上展示的许多新功能并未完全落地,就我个人而言,今年似乎少了往日的热情和渴望。希望这只是我个人的情况。
期待越高,失望越大。避免失望的最好方式莫过于调整期待值。今年,我选择以更加平和的心态迎接 WWDC 的到来,不过分期待,不盲目乐观,但也不放弃对技术进步的关注与思考。
你呢?对即将到来的 WWDC 2025,你有什么期待或想法?
在 SwiftUI 的众多 API 中,.ignoredByLayout()
算是一位“低调的成员”。相关资料稀少,应用场景也不常见,其名称本身就容易引发困惑。它似乎暗示着某种对布局的“忽略”,但这与我们熟知的 offset
或 scaleEffect
等修饰符默认不影响父布局的行为有何不同? ignoredByLayout
究竟在什么时机工作?它到底“忽略”或“隐瞒”了什么?本文将为你揭开这个 SwiftUI 布局机制中微妙 API 的面纱。
在 iOS 信息应用中,用户点击消息后会弹出一个包含多种表情的辅助视图,其精巧的设计和自然的展开动画令人印象深刻。遗憾的是,苹果始终未开放这一实现方式的相关 API。在本文中,Seb Vidal[6]详尽介绍了如何通过 UIKit 的私有类 _UIContextMenuAccessoryView
,为自己的 App 添加类似的交互体验。由于涉及私有 API,该方案存在 App Store 审核风险。为此,作者还提供了一个 App Review 安全的 Swift 实现分支[7],通过更动态和间接的方式实现类似效果,适合在测试或内部工具中使用。
Aether[8]基于该研究开发了 MenuWithAView[9],使 SwiftUI 开发者也能轻松为上下文菜单添加自定义辅助视图。
在使用 Swift Charts 时,Chris Wu[11]遇到了一个奇怪的问题:基于 LineMark
绘制的图表始终无法精确对齐午夜,往往略晚开始、略早结束。经过长时间查阅文档、向 AI 求助无果后,最终他在 Stack Overflow 中一条仅有两赞的评论中找到了关键线索。
问题出在 .value(_:unit:)
的 unit
参数上——它会让绘图点落在两个单位之间的中点(例如 .hour
会将 8:00 显示在 8:30),这虽然适用于柱状图,却会使折线图产生对齐偏差。移除 unit:
和 calendar:
后,图表终于与午夜轴线完美对齐。
AI 的知识边界受限于语料覆盖面,对于这种缺乏广泛讨论的问题,反而不如一个冷门但关键的手动搜索来得管用。
SwiftUI 中有不少实用却鲜为人知的 API 细节——至少在读这篇文章之前,我并不知道 .tag
可以直接支持 nil
。在本文中,Keith Harrison[13]展示了一个简单而实用的技巧:如何让 Picker
与可选类型的 Binding
协同工作,并支持“不选任何值”这一场景,适用于诸如“无项目”或“重置选择”等常见需求。
在 Swift 6 对并发的严格检查下,即便代码只在单线程中运行,开发者仍需添加大量显式标注以满足类型系统的安全要求。为此,Swift 6.2 引入了一个重要改进:默认隔离(default isolation)。 Matt Massicotte[15]在本文中介绍了如何通过 .defaultIsolation(MainActor.self)
在模块级设置默认隔离策略,从而减少冗余标注,并改善 Swift 并发的开发体验。
这是一次给予开发者更多控制权的更新,但也意味着更大的设计抉择:是将整个项目默认隔离为
@MainActor
,还是继续使用显式标注?Swift 正在迈向更安全的并发模型,而如何选择默认值,将成为每个团队的重要决策。
为了在 Widget 和 App Intents 中共享数据,许多开发者选择将 SQLite 数据库存放在 App Group 容器中。然而,Ryan Ashcraft[17]指出,这种看似合理的做法可能导致难以调试的系统崩溃,最典型的是神秘的 0xDEAD10CC错误。该错误并非死锁,而是 iOS 为防止挂起进程长期持有文件锁、阻塞其他进程访问数据库,而强制终止 App 的机制。Ryan 在文中详解了触发机制及多个缓解方案,但也坦言这些策略实现复杂、效果有限。
0xDEAD10CC
是 iOS 系统层面的老问题,Michael Tsai[18]也就此整理了一个讨论汇总帖[19],欢迎加入交流。
SwiftUI 的 @FocusState
虽然为聚焦控制提供了便利,但其局限也很明显:无法与 @Binding
直接联动、难以在视图之间传递,且无法用于 ViewModel 中的状态管理。在复杂表单或状态驱动的 UI 中,这些问题尤其突出。Artem Mirzabekian[21]在本文中提出了一个更灵活的替代方案——FocusModifier
,它通过可选绑定(Binding<T?>
)管理聚焦状态:当值匹配时自动聚焦视图,失焦时清除绑定。这种做法使焦点控制更加可组合、可测试,也便于将逻辑抽离至 ViewModel。
在过去的两个月里,SwiftGG 翻译组对《Swift 编程指南》进行了重要升级:不仅将手册内容同步至 Swift 6.1,还对中文官网的设计风格进行了调整,使其与 Swift 官方文档保持一致,带来更加统一和现代的阅读体验。
访问 SwiftGG 在 GitHub 上的仓库[23],了解如何参与《Swift 编程指南》中文版的维护工作。
Redline 是由 Robb Böhnke[25]开发的 SwiftUI 视图 Modifier 合集,提供了丰富的可视化工具,用于标示视图的位置、尺寸、间距和对齐方式,帮助开发者快速验证布局实现或排查界面问题。
小提示:Robb 为每个 Modifier 都提供了代码预览,不仅便于理解和使用,也是一份出色的 SwiftUI 布局教学资源。
如果你觉得这份周报或者我的文章对你有所帮助,欢迎 点赞、赞赏,并将其 转发给更多的朋友。
参考资料
[1]
weekly.fatbobman.com: https://weekly.fatbobman.com
[2]
肘子的 Swift 记事本: https://fatbobman.com
[3]
Discord: https://t.ly/gzxeh
[4]
揭秘 .ignoredByLayout():让视觉变换“隐形”于布局之外: https://fatbobman.com/zh/posts/demystifying-swiftuis-ignoredbylayout/?utm_source=fatbobman%20weekly%20issue%2084&utm_medium=web
[5]
为上下文菜单加点料 (Accessorise Your Context Menu Interactions): https://l.fatbobman.com/w084-01
[6]
Seb Vidal: https://x.com/SebJVidal
[7]
App Review 安全的 Swift 实现分支: https://github.com/sebjvidal/_UIContextMenuAccessoryView-Demo
[8]
Aether: https://x.com/AetherAurelia
[9]
MenuWithAView: https://github.com/Aeastr/MenuWithAView
[10]
图表对齐之谜,终于解开了 (Finally Fixing My Swift Charts Alignment Problem): https://l.fatbobman.com/w084-02
[11]
Chris Wu: https://bsky.app/profile/chriswu.com
[12]
让 Picker 支持“未选择” (SwiftUI Picker With Optional Selection): https://l.fatbobman.com/w084-03
[13]
Keith Harrison: https://x.com/kharrison
[14]
Swift 6.2 默认隔离机制解析 (Default isolation with Swift 6.2): https://l.fatbobman.com/w084-04
[15]
Matt Massicotte: https://mastodon.social/@mattiem
[16]
别把 SQLite 放进 App Group (SQLite Databases in App Group Containers: Just Don't): https://l.fatbobman.com/w084-05
[17]
Ryan Ashcraft: https://mastodon.social/@ryanashcraft
[18]
Michael Tsai: https://mastodon.social/@mjtsai
[19]
讨论汇总帖: https://mjtsai.com/blog/2025/05/15/sqlite-databases-in-app-group-containers-dont/?utm_source=fatbobman%20weekly%20issue%2084&utm_medium=web
[20]
用自定义 Modifier 优雅管理焦点 (Simplifying Focus Management in SwiftUI with a Custom ViewModifier): https://l.fatbobman.com/w084-06
[21]
Artem Mirzabekian: https://x.com/livsycode
[22]
Swift 6.1 编程指南中文版: https://l.fatbobman.com/w084-07
[23]
SwiftGG 在 GitHub 上的仓库: https://github.com/SwiftGGTeam/the-swift-programming-language-in-chinese
[24]
RedLine: https://l.fatbobman.com/w084-08
[25]
Robb Böhnke: https://mastodon.social/@dlx