Issue #114

挖掘“沉默的专家”

Cover for Weekly Issue 114

Photo by Alex Gruber on Unsplash

关注我博客的读者可能留意到,最近一段时间我较少发表个人的作品,取而代之的是,我陆续发布了多篇来自不同开发者的客座文章。没错,这是我近期发起的一项特别企划——邀请那些在各自领域深耕且卓有建树的开发者,分享他们的实战经历、独家秘籍、独特视角以及心路历程。

作为一名博主,不知不觉间我已经写了几百篇文章。虽然我相信这些内容仍具价值,但不得不承认,和许多定期输出的作者一样,我逐渐陷入了一种“程式化”的写作惯性中。我的文章往往侧重于探讨 API 的用法、剖析内部细节,但更多是基于“Demo”思维来构建的。即便涉及 Bug 修复或避坑指南,往往也只是处理一个个孤立的“点”,而非连贯的“线”或“面”。

作为周报编辑,我也观察到:尽管互联网上每周都有大量优秀技术文章涌现,但针对特定领域、能展开深度讨论且贴近一线实战的内容却显得稀缺。逐渐我意识到,主要原因是那些奋战在一线的开发者往往缺乏时间或精力来撰写这类长文。为此,几个月前我开始策划这项活动,主动向这类开发者约稿,试图挖掘这些“沉默的专家”,将他们脑海中的“隐性知识”显性化。

在与作者们的沟通中,我常遇到这样的场景:对方不知道该写什么。尽管他们每天都在解决棘手的难题,但因长期浸淫其中,往往“身在庐山不知真面目”,逐渐忽略了这些经验的普适价值。许多人认为自己的工作稀松平常——“难道这些不是常识吗?真的会有人想了解这些?”每当此时,我便会切换回开发者和读者的视角,向他们表达我对该领域的好奇,以及我渴望探究的那些“行业秘密”。

在 AI 时代,大模型或许已经掌握了海量的 API 用法和代码范式。但对于人类而言,那些真挚的情感、与物理世界的真实碰撞、以及从无数次失败实践中提炼出的教训,仍是我们最宝贵且独特的财富。

非常感谢这些作者,能在繁忙的工作中抽调时间与精力,无私地分享他们的知识宝藏。文中的许多内容,若非经过长期的工程实践和被困难反复地“折磨”,是绝不可能产生如此深刻的体悟的。

这项挖掘“沉默专家”的计划仍在继续。这不仅是为了丰富博客的内容,更是为了我们自己,为了社区。在这个信息逐渐被 AI 同质化的今天,我希望能为大家保留并呈现更多由鲜活经验铸就的、不一样的声音。

近期推荐

SwiftUI 图文混排深度剖析:超越 AttributedString —— MarkdownView 与 RichText 的实现

虽然 AttributedString 已经推出多年,但 SwiftUI 仍然缺乏「完整 Markdown 渲染 + 图文混排 + 可选中文本 + 精细交互」的官方支持。作为 MarkdownViewRichText 的作者,LiYanan 在本文中系统回顾了他为解决这些问题所进行的技术探索——从最初尝试 Layout 协议,到踩过 TextRenderer 的种种限制,再到最终基于 TextKit 打造可交互、高性能的 Markdown 渲染组件。这既是一份关于坚持与成长的技术复盘,也是目前 SwiftUI 文本渲染领域难得的资料。


我该开启哪些 Swift 编译器设置? (What Setting Should I Use?)

十岁的 Swift 从未像今天这样强大,但随之而来的复杂度也显而易见。除了更多的语言特性,你还要面对不断扩张的编译器设置——它们彼此组合,足以构建出“不同年代、不同哲学、不同语义”的 Swift。

在这篇文章中,Matt Massicotte 用非常接地气的方式回答了一个现实问题:**在 Swift 6.2 / Xcode 26 时代,我究竟应该打开哪些编译器设置?如果你正犹豫是否切换到 6 语言模式,或迟迟拿不定主意 StrictConcurrency 应设为 minimal、targeted 或 complete,这篇文章可以视作一份决策辅助清单,帮助你按更可控、渐进的方式完成迁移。


枚举背后的力量 (Swift Enum Hidden Magic Tricks)

枚举是 Swift 中极具辨识度的语言特性,其能力远超“带点关联值的分支语句”。在许多资深 Swift/iOS 开发者眼中,枚举更像是一种用于塑造架构边界的建模工具,尤其在管理复杂状态时格外突出。Bruno Valente Pimentel在本文中系统阐述了枚举如何帮助我们让无效状态不可表示(Make Invalid States Unrepresentable),并通过多个真实项目的演化过程展示这一思想如何从“语法技巧”升级为“设计方法论”。

“让无效状态不可表示”是类型驱动设计推崇的关键思想之一。如果你想进一步理解这一理念的底层思想,非常建议一并阅读 Alex OzunType-Driven Design with Swift 系列文章。


为应用设置替代名 (Make Your App Visible with Alternative App Names)

在日常使用中,你可能注意到某些 iOS 应用可以通过多个名称在 Spotlight 中被搜索到,这在实际使用场景中非常便利。其背后正是 SiriKit 提供的能力:开发者可以在应用的 Info.plist 中配置最多 3 个替代名称,使用户能够通过不同的关键词更轻松地找到你的应用。Wesley de Groot 在本文中介绍了这一功能的具体实现方式。

随着 macOS 26 移除了“启动台”(Launchpad),越来越多的用户开始依赖 Spotlight 启动应用。或许未来,类似的替代名称机制也会被引入到 macOS 平台。


用 @TabContentBuilder 组织你的 Tab 声明 (Organizing SwiftUI Views with TabContent and @TabContentBuilder)

在最近的两个版本中,SwiftUI 对 Tab 支持进行了大幅扩展:从传统的底部分页导航,延伸到更灵活的结构化场景,例如在大屏设备上表现类似侧边栏的导航模式。因此,许多项目的 Tab 声明开始变得越来越庞大:角色控制、条件分支、导航栈、标签配置与团队约定往往混杂在同一个 TabView 中。Artem Mirzabekian 在文中建议将与 Tab 相关的配置从主布局中抽离,借助自定义的 @TabContentBuilder 搭建一个专属的、可组合的 tab 定义区域。这种组织方式能够显著提升可读性与可扩展性,让 Tab 导航的维护不再成为 SwiftUI 项目的难点。

除了 @ViewBuilder 外,SwiftUI 还提供了大量领域专用的 result builder,如 TableColumnBuilderCommandsBuilderSceneBuilderToolbarContentBuilderChartContentBuilder 等。更精确地选用这些 builder,不仅能让视图结构更清晰,也能在复杂场景(例如并用 Charts 与 Table)减少类型推断负担,避免触发 SwiftUI 常见的 “type-checking explosion”。


用 LLDB 调试 SwiftUI 应用 (LLDB Power User Guide: Essential Commands & SwiftUI Debugging)

调试 SwiftUI 向来不轻松。相比在代码里不断插入 print,尽管 LLDB 的能力更强大,但却往往被忽略。在这篇文章中,Jai Krishna 通过大量 SwiftUI 示例演示了如何在 LLDB 中实时查看和修改 @State@Binding@Published 的内部状态,使用 Self._printChanges() 追踪视图的重绘来源,并借助精细化的断点策略定位布局与交互问题。


如何查找应用的挂起原因 (Identifying Hangs in iOS Apps)

许多开发者都会遇到主线程阻塞导致的 UI 挂起,但具体卡在什么位置、由何引起,并不是每个人都能准确调试。Tiago Henriques 通过一个刻意制造卡顿的示例 App,演示了如何利用 Instruments 的 Time Profiler 来初步判断问题的性质和范围。复现与识别只是解决问题的第一步,作者也表示如果读者感兴趣,未来还会继续推出这一主题的深入内容。

工具

SwiftUI Ratings

如果你正在为 App 构建评分/评论界面,或希望在应用内更自然地引导用户前往 App Store 留下评价,由 James Sedlacek 开发的 SwiftUI-Ratings 提供了一套即插即用的解决方案。它实现了一个高度可定制的评分界面,风格上与 App Store 的评分与评论页相近,允许开发者通过 AppRatingProviding 协议灵活接入任意数据源(项目中提供了 mock 实现与 Supabase / App Store Connect API 示例)。对于需要快速搭建“应用内评分请求”功能的开发者来说,这是一个轻量、现代、且易于扩展的选择。


Swift Hugging Face

Hugging Face 是全球领先的开源 AI 社区与模型平台,提供海量模型、数据集、工具链及协作空间,作为关键的 AI 基础设施,赋能研究者、工程师与企业高效构建并部署 AI 应用。

作为 Hugging Face 官方出品的 Swift 客户端,Swift Hugging Face 提供了两大核心能力:一方面,它完整封装了 Hugging Face Hub API,使开发者能够以原生 Swift 方式管理模型、数据集、Spaces 等资源;另一方面,它无缝集成 Inference API,让文本生成(Chat Completion)、文本向量化、文生图/视频(Text-to-Image/Video)、语音转写等任务能够直接在 iOS、macOS、visionOS 乃至 Linux 与 Windows 上运行。

在文章 Introducing swift-huggingface: The Complete Swift Client for Hugging Face 中,Mattt 详细阐述了该库的设计理念与核心使用方式,为 Swift 开发者打开了接入 Hugging Face AI 生态的完整路径。

相关周报

订阅 Fatbobman 周报

每周精选 Swift 与 SwiftUI 开发技巧,加入众多开发者的行列。

立即订阅