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