Fatbobman's Swift Weekly #118
An AT Life Isn't Necessarily Better Than an MT One

An AT Life Isn’t Necessarily Better Than an MT One
When I learned to drive, I used a manual transmission (MT). At first, my lack of skill often left me flustered, so for my first car, I went straight for an automatic (AT). However, after driving for a few years, I began to crave that sense of total control, so I added a manual car to my collection. Regrettably, as traffic congestion grew worse, the joy of shifting gears was gradually canceled out by exhaustion, and that car eventually sat neglected. It has been nearly twenty years since I seriously drove a manual, but deep down, I still occasionally miss that time when “man and car were one.”
As AI integrates more deeply into my work and life, I feel my existence shifting from MT to AT. Undoubtedly, AI has helped me break through many bottlenecks and brought immense efficiency gains even in familiar fields. But strangely, my sense of wonder about it keeps fading. It seems to have saved me time, yet I haven’t gained the expected satisfaction from this “extra time.” Perhaps my threshold for expectations keeps rising, but the undeniable fact is: I haven’t experienced that simple joy in the process of learning and developing for quite a while.
Fortunately, I rediscovered this long-lost happiness a few days ago. While preparing my Keynote for iOS Conf SG, because the app still relies on relatively “primitive” construction methods for animation—and lacks AI features—I had a rare, uninterrupted block of time to manually experiment and tweak things. Even for a simple parallel animation, I tinkered with great delight, debating between transitions, standard animations, or “Magic Move.” Settings that an expert might finalize in two or three minutes took me half a day of tinkering. Although efficiency was non-existent, I enjoyed every moment. Looking at the final, slightly “crude” effect I’d built, I found myself genuinely moved by what I’d made.
For professionals, efficiency and completeness are certainly hard metrics. But being able to experience the tangible reality in the process is perhaps a fundamental human pursuit.
I probably won’t buy an MT vehicle again, but as long as I can still grip the steering wheel, I won’t let “smart driving” take over completely. The same goes for coding—I fell in love with it because it brought me pure joy. When all our tools push us to be faster and better, I think we should leave ourselves a bit of space to be slower and “dumber”—after all, an AT life isn’t necessarily better than an MT one.
Previous Issue|Newsletter Archive
📢 Sponsor Fatbobman’s Swift Weekly
Promote your product to Swift & iOS developers across:
- Blog: 50,000+ monthly visitors
- Newsletter: 4,000+ subscribers, 53% open rate
Perfect for developer tools, courses, and services.
Enjoyed this issue? Buy me a coffee ☕️
Recent Recommendations
Farewell to Portable Assembly: I’ve Been Running Swift on MCUs for Seven Years
Since 2024, Swift has officially provided support for embedded systems, but gaining significant market share in this field still has a long way to go. In fact, as early as 2018, before the official support, Andy Liu and his MadMachine team began exploring and practicing the application of Swift in the embedded field, launching related hardware products along the way. They firmly believe that in increasingly complex development scenarios, Swift’s modern language features will demonstrate tremendous advantages. In this article, Andy shares his journey of exploration in this field over the past few years. I sincerely hope that Swift can showcase its charm in more scenarios.
Building a Base DialSlider Component in SwiftUI
In today’s world where AI capabilities are increasingly powerful, getting AI to help you implement a visual effect has become easier than ever. However, whenever I see developers continuously exploring implementation approaches and refining effects through their own “creative ingenuity”, I still find myself genuinely impressed. In this article recreating a “vintage telephone dial”, codelaby cleverly utilizes SwiftUI’s .compositingGroup() and .blendMode(.destinationOut) to achieve a dynamic “cutout” effect, making static numbers beneath the rotating layer clearly visible—offering more flexibility and native feel compared to simply rotating an image. Additionally, the article provides a thoroughly clear explanation of circular gesture handling, angle calculations (atan2), and stopper logic.
CKSyncEngine Questions and Answers
Many developers have complained about Core Data’s NSPersistentCloudKitContainer, finding it opaque and lacking customizability. However, when they actually try to tackle CloudKit data synchronization themselves, they discover there are far more considerations than imagined, with difficulty far exceeding expectations. Apple’s CKSyncEngine, introduced several years ago, completely broke through this impasse by providing clearer state management and error handling, automatically handling numerous complex edge cases, allowing developers to focus on building data synchronization logic.
Christian Selig shares his experience using the CKSyncEngine API through a Q&A format, detailing how CKSyncEngine serves as a perfect middle layer that retains data storage flexibility (you can continue using SQLite, Realm, or JSON) while taking over the most troublesome synchronization state management.
My Beef with the iOS 26 Tab Bar
SwiftUI’s adjustments to the Tab Bar in iOS 18 have had an impact almost comparable to when NavigationStack/NavigationSplitView replaced NavigationView—not only changing the design language but also having a disruptive effect on application implementation and data flow. The “search tab” feature introduced for iOS 26’s Liquid Glass style further advances this transformation. In this article, Ryan Ashcraft candidly points out numerous issues with the new Tab Bar design: the default floating style appears jarring in certain interfaces and is difficult to coordinate with the overall visual style of applications; new margin and spacing rules break long-standing design conventions, requiring developers to readjust large amounts of existing interfaces; more importantly, these changes have not significantly improved user experience but instead increased adaptation costs.
My biggest impression of the new Tab is that it will significantly impact developers’ decisions regarding minimum system versions when developing applications. Is it worth maintaining two sets of code for Tab? If simplifying implementation forces raising the minimum version to iOS 18, this might be another design intention of the SwiftUI team.
Dia: A Technical Deep Dive into The Browser Company’s macOS Browser
Arc was the first major Windows platform application built using Swift, and The Browser Company has made outstanding contributions to the Swift community’s Windows toolchain. After transitioning from Arc to Dia, the development team has not abandoned Swift, so what development frameworks does Dia specifically use on macOS?
In this article, Everett reveals Dia’s unique technical architecture: this is a native macOS application based on AppKit + SwiftUI, but its core rendering engine is not WebKit—instead, it embeds a self-modified Chromium (ArcCore). Additionally, a large number of local AI-related libraries (such as Apple MLX and LoRA adapters) were discovered in Dia’s binary files, indicating that Dia is not just about “speed” but has already prepared the underlying engineering for on-device AI inference.
Myths about Logitech Developer ID certificate expiration
A few days ago, many macOS users discovered that their Logitech mouse custom buttons had stopped working. Due to control console logs being filled with code signing-related errors, many users and media outlets attributed this to “Apple revoking certificates.” Through analyzing system logs, Jeff Johnson vindicated Apple’s role in this incident: this was not an Apple certificate service failure, but rather a software engineering issue on Logitech’s end. After updating, the Logi Options+ background process failed to pass macOS taskgated code signature validity verification and was directly terminated by the system. This article is not only a failure analysis report but also reminds developers: under macOS’s strict security mechanisms, the signature verification process for application updates cannot tolerate any carelessness.
“If your certificate expires, users can still download, install, and run versions of your Mac applications that were signed with this certificate. However, you’ll need a new certificate to sign updates and new applications.” — Apple Official Documentation
Stop Getting Average Code from Your LLM
Undeniably, in the ocean of information accumulated by humanity over time, high-quality data and information constitute only a minority. For individuals, we can purposefully identify and learn from this quality content. However, due to mechanism limitations, LLMs default to the “average” of their training data, causing the content they generate to appear mediocre in various aspects. In the specific context of Swift development, this often means generating large amounts of outdated, unstructured code.
To obtain high-quality code that conforms to Swift 6 standards or even specific architectural styles, the key is to combat this “regression to the mean” instinct. Krzysztof Zabłocki provides detailed guidance on how to use Few-Shot Prompting and context injection techniques, forcing the LLM to “forget” mediocre default settings by providing specific code examples and architectural specifications, instead generating high-quality code that precisely matches project standards.
Tools
swift-effect: A Type-Driven Approach to Side Effects
Alex Ozun has long focused on type-driven design in Swift, and this library is his practice of “Algebraic Effects + Effect Handlers” in Swift.
swift-effect doesn’t turn side effects into “data structures to be interpreted,” but rather models side effects as interceptable global operations (@Effect), combining and replacing behaviors at runtime through handlers, allowing business code to maintain a linear/procedural style while providing fine-grained control over I/O, concurrency, and other behaviors.
Core highlights:
Maintains Linear Code: Calling effects like Console.print works like regular functions, but behavior can be dynamically determined by handlers.
Behavior Testing Without Mocks: Use
withTestHandlerto intercept/assert effect sequences step by step, testing processes like “interactive scripts.”Controllable Concurrency: Supports deterministic testing of Task/AsyncSequence, solving the problem of unstable concurrency ordering.
Codex Skill Manager: A macOS Tool for Multiple CLI Services
Many developers use multiple AI programming services simultaneously. Although they have similar concepts, configurations, and tool types, differences remain in specific settings and detailed descriptions, making it difficult for developers to manage all services uniformly. Thomas Ricouard‘s Codex Skill Manager consolidates skills from Codex, Claude Code (as well as OpenCode and Copilot) in a single UI for viewing, searching, deleting, and importing, avoiding manual searching through multiple hidden directories.
Core Features:
Local Skills: Scans paths like
~/.codex/skills/publicand~/.claude/skills, displaying lists and detailsDetail Rendering: Markdown view + reference preview
Remote Skills: Clawdhub search/latest lists, detail fetching and downloading
Import/Delete/Custom Paths: Supports importing from zip or folders, sidebar deletion, adding custom paths
Multi-platform Installation Status: Marks installation status for different platforms
Events
LET’S VISION 2026
Born to Create. Powered by AI.
Speakers • Exhibitors • Partners — now open
📍 Shanghai | March 27–29, 2026
Apple ecosystem · AI · Spatial Computing See you in Shanghai.
Let’s shape the future together.
Swift Student Challenge 2026
The annual student challenge returns once again. The challenge provides thousands of student developers with the opportunity to showcase their creativity and programming abilities, allowing them to present their work through App Playground and learn practical skills that will serve them throughout their careers.
This year’s submission period will be open from February 6 to February 28, 2026.
Thanks for reading Fatbobman’s Swift Weekly! This post is public so feel free to share it.
AT 的人生未必比 MT 更好
学车时我开的是手动挡,起初因为技术生疏,常搞得手忙脚乱,所以第一台车就直接选了自动挡。但开了几年,我开始追求那种完全掌控的驾驶感,于是又增购了一台手动挡。遗憾的是,随着交通日益拥堵,换挡的乐趣逐渐被疲惫抵消,最终这台车也被冷落。算起来,我已经快二十年没认真开过手动挡了,但内心深处,我仍会时不时地怀念那段“人车合一”的时光。
随着 AI 深度介入我的工作与生活,我感觉自己的人生正从 MT 转向 AT。毫无疑问,AI 助我突破了许多能力瓶颈,也在熟悉领域带来了巨大的效率提升。但奇怪的是,我对它的“惊叹”却在与日俱减。看似它节省了我的时间,但我并未从这些“多出来的时间”里获得预期的满足感。也许是我对它的期望阈值不断提高,但一个不争的事实是:我已经有一段时间没有在学习和开发过程中,体会到那种单纯的快乐了。
幸好,几天前我又找回了这种久违的开心。在准备 iOS Conf SG 的 Keynote 时,由于 Keynote 在动画构建上相对“原始”且缺乏 AI 辅助,我难得地拥有一段完整的时间,去纯手工地尝试和修改。哪怕只是一个简单的并行动画,究竟是用转场、普通动画还是“神奇移动”,我都玩得不亦乐乎。那些在专家手里可能两三分钟搞定的设置,我折腾了大半天。尽管毫无效率可言,但我乐在其中。看着最终那个略显“简陋”的效果,我竟被自己感动了。
对于职场中人,效率和完成度固然是硬指标;但能否体会到过程带来的“实感”,或许才是作为“人”最朴素的追求。
我大概率不会再买 MT 的车了,但在我还能握紧方向盘的时候,也不会轻易让“智能驾驶”代劳。写代码也是如此,当初爱上它,正是因为它能给我带来纯粹的快乐。当所有工具都在催促我们变得更快更好时,我想应该给自己留一点变慢、变“笨”的空间——毕竟,AT 的人生未必比 MT 更好。
如果您发现这份周报或我的博客对您有所帮助,可以考虑通过 爱发电,Buy Me a Coffee 支持我的创作。
近期推荐
告别“可移植汇编”:我已让 Swift 在 MCU 上运行七年
从 2024 年开始,Swift 官方正式提供了对嵌入式系统的支持,但要在这个领域获得显著份额,仍有很长的路要走。其实,早在官方下场之前的 2018 年,Andy Liu 和他的 MadMachine 团队就开始在探索和实践将 Swift 应用于嵌入式领域,并陆续推出了相关硬件。他们坚信,在功能日益复杂的开发场景中,Swift 的现代语言特性将展现出巨大的优势。在本文中,Andy 分享了过去几年中在该领域的探索历程。我真心希望,Swift 能够在更多的场景中,展现其魅力。
在 SwiftUI 中构建基础拨号滑块组件 (Building a Base DialSlider Component in SwiftUI)
在 AI 功能越来越强大的今天,看到一个动效,让 AI 帮你实现已经越来越容易了。但每当看到开发者凭借自己的”奇思妙想”不断探索实现方式并打磨效果时,我仍会由衷赞叹。codelaby 在这篇复刻”老式电话拨号盘”的文章中,巧妙运用 SwiftUI 的 .compositingGroup() 和 .blendMode(.destinationOut) 实现了动态”镂空”效果,使旋转层下的静态数字清晰显现,相比单纯旋转图片更具灵活性和原生质感。此外,文章对环形手势处理、角度计算(atan2)以及限位逻辑(Stopper)的阐述也十分透彻清晰。
CKSyncEngine 答疑与实战经验分享 (CKSyncEngine Questions and Answers)
不少开发者对 Core Data 的 NSPersistentCloudKitContainer 颇有诟病,认为其不透明且缺乏定制性。但真正想自己着手解决 CloudKit 的数据同步问题时,才发现需要考虑的地方实在太多,难度远超想象。苹果在几年前推出的 CKSyncEngine 彻底打破了这个困境,提供了更清晰的状态管理和错误处理,并自动处理了诸多复杂的边缘情况,让开发者可以专心构建数据同步逻辑。
Christian Selig 通过自问自答的方式,分享了他在使用 CKSyncEngine API 时的经验,详细拆解了 CKSyncEngine 如何作为一个完美的中间层,在保留数据存储灵活性(你可以继续用 SQLite、Realm 或 JSON)的同时,接管了最令人头疼的同步状态管理。
我对 iOS 26 Tab Bar 的吐槽 (My Beef with the iOS 26 Tab Bar)
SwiftUI 在 iOS 18 中对 Tab Bar 的调整,其影响几乎堪比当年 NavigationStack/NavigationSplitView 取代 NavigationView,不仅改变了设计语言,对应用的实现方式和数据流走向都产生了颠覆性影响。而为 iOS 26 Liquid Glass 风格引入的”搜索标签”功能进一步推进了这种变革。Ryan Ashcraft 在这篇文章中直言不讳地指出了新 Tab Bar 设计的诸多问题:默认的浮动样式在某些界面中显得突兀,与应用整体视觉风格难以协调;新的边距和间距规则打破了长期以来的设计惯例,让开发者需要重新调整大量现有界面;更重要的是,这些改动并未明显提升用户体验,反而增加了适配成本。
我个人对新 Tab 的最大感受是,它会显著影响开发者在开发应用时对最低系统版本的决策。为 Tab 维护两套代码是否值得?如果为了简化实现而不得不将最低版本提高到 iOS 18,这或许正是 SwiftUI 团队的另一个设计意图?
Dia:深度剖析 The Browser Company 的 macOS 浏览器架构 (Dia: A Technical Deep Dive into The Browser Company’s macOS Browser)
Arc 是第一个使用 Swift 构建的大型 Windows 平台应用,而且 The Browser Company 也因此为 Swift 社区的 Windows 工具链做出了突出贡献。在从 Arc 转型到 Dia 后,开发团队并没有放弃使用 Swift,那么 macOS 端的 Dia 具体使用了哪些开发框架呢?
Everett 在本文中揭示了 Dia 独特的技术架构:这是一个基于 AppKit + SwiftUI 的原生 macOS 应用,但其核心渲染引擎并非 WebKit,而是嵌入了自行修改的 Chromium(ArcCore)。此外,在 Dia 的二进制文件中发现了大量与本地 AI 相关的库(如 Apple MLX 和 LoRA 适配器),这预示着 Dia 并非只是为了”快”,而是已经为设备端 AI 推理做好了底层工程准备。
关于罗技开发者证书过期的迷思 (Myths about Logitech Developer ID certificate expiration)
几天前,不少 macOS 用户发现罗技鼠标的自定义按钮失效。由于控制台日志中充斥着代码签名(Code Signing)相关的报错,不少用户和媒体将其归咎于”苹果撤销了证书”。Jeff Johnson 通过分析系统日志为苹果在本次事件中的角色进行了平反:这并非苹果的证书服务故障,而是罗技自身软件工程问题导致的。Logi Options+ 的后台进程在更新后,未能通过 macOS taskgated 的代码签名有效性验证,从而被系统直接终止。这篇文章不仅是一份故障分析报告,更提醒开发者:在 macOS 严格的安全机制下,应用更新的签名验证流程容不得半点马虎。
“如果你的证书过期了,用户仍然可以下载、安装和运行用该证书签名的 Mac 应用程序版本。但是,你需要一个新的证书来签署更新和新申请。” —— 苹果官方文档
拒绝 LLM 生成的平庸代码 (Stop Getting Average Code from Your LLM)
不可否认,在人类长久以来累积的信息海洋中,高质量的数据与信息只占少数。对于个体来说,我们完全可以有目的地去甄别和学习这些优质内容。但是,受限于机制,LLM 默认倾向于训练数据的“平均值”,这就导致它生成的内容在各个方面都显得比较平庸。具体到 Swift 开发领域,这往往意味着它会生成大量旧版的、非结构化的代码。
要想获得高质量、符合 Swift 6 标准甚至特定架构风格的代码,关键在于对抗这种“回归均值”的本能。Krzysztof Zabłocki 详细介绍了如何利用 Few-Shot Prompting(少样本提示)和上下文注入技术,通过提供具体的代码范例和架构规范,强迫 LLM “忘记”平庸的默认设置,转而生成精准匹配项目标准的高质量代码。
工具
swift-effect: 一种基于类型驱动的副作用处理方案
Alex Ozun 长期关注 Swift 中的 类型驱动设计,这个库是他对“代数效应(Algebraic Effects)+ 处理器(Effect Handlers)”在 Swift 里的实践。
swift-effect 不是把副作用变成“数据结构再解释”,而是将副作用建模为可拦截的全局操作(@Effect),通过 handler 在运行时组合和替换行为,让业务代码保持线性/过程式风格,同时又能精细控制 I/O、并发等行为。
核心亮点:
保持代码线性:调用 Console.print 等 effect 就像普通函数,但行为可由 handler 动态决定。
无 Mock 的行为测试:用
withTestHandler逐步拦截/断言 effect 序列,像“交互式脚本”一样测试流程。并发可控:支持对 Task/AsyncSequence 的确定性测试,解决并发顺序不稳定的问题。
Codex Skill Manager: 一款面向众多 CLI 的 macOS 工具
很多开发者都会同时使用多种 AI 编程服务,尽管它们拥有类似的概念、设定和工具类型,但在具体设置和细节描述上仍有差异,这导致开发者很难对所有服务进行统一管理。Thomas Ricouard 开发的 Codex Skill Manager 将 Codex、Claude Code(以及 OpenCode、Copilot)的技能集中在一个 UI 里查看、搜索、删除和导入,避免在多个隐藏目录中手动寻找。
核心功能
本地技能:扫描
~/.codex/skills/public、~/.claude/skills等路径,展示列表与详情详情渲染:Markdown 视图+引用预览
远程 Skill:Clawdhub 搜索/最新列表、详情拉取与下载
导入/删除/自定义路径:支持从 zip 或文件夹导入、侧边栏删除、添加自定义路径
多平台安装状态:为不同平台标记已安装状态
活动
LET’S VISION 2026|邀请你与我们同行!
✨ 大会主题:Born to Create, Powered by AI
📍 地点:上海漕河泾会议中心
⏰ 时间:2026 年 3 月 27 日 - 3 月 29 日
🏁 重点:汇聚顶尖创作者与 AI 技术大咖,共同探索 AI 应用的未来边界
别走开!请关注官方账号和主理人 SwiftSIQI,我们将持续放送更多精彩内容!
Swift Student Challenge 2026
每年一度的学生挑战赛再次登场。挑战赛为数以千计的学生开发者提供了展现创造力和编程能力的机会,让他们可以通过 App Playground 呈现自己的作品,并从中学习在职业生涯中受用的实际技能。
今年作品提交通道将于 2026 年 2 月 6 日至 2 月 28 日开放。

