在 weekly.fatbobman.com[1]订阅本周报的电子邮件版本。访问我的博客 肘子的 Swift 记事本[2]查看更多的文章。加入 Discord[3]社区,与 2000+ 中文开发者深入交流 Swift、SwiftUI 开发体验。
几天前,一位之前高度赞扬并全身投入 Vibe Coding 的好友发表了一篇推文,表达了他近期基于 AI 编程的挫败感:
"最近的 Vibe Coding 并没有给我写代码带来任何愉悦感,正相反的是 AI 无法一击必中带来的挫败感。开始重新阅读官方文档和优质视频,自下而上,那种对项目的掌控感又回来了。"
我想这种情绪也会出现在不少开发者身上。当今的大语言模型往往能在我们不太熟悉的领域展现惊人能力,给我们留下深刻的第一印象,从而产生过高期待。然而深入使用后,我们才逐渐发现 AI 的局限性远比想象中更为明显。
一直以来,我在编程中都将 AI 的参与限制在特定范围内:生成并完善文档、以函数为单位对代码进行优化、帮助我理解和学习陌生的框架与技术细节等。即便如此,AI 带来的效率提升依然令人惊叹。更可贵的是,在 AI 的辅助下,我能感受到自己技能的不断提升,这种成长给了我掌控技术的信心。
回想 ChatGPT 刚出现时引发的社会恐慌(人力将被取代,导致大量失业),这些预言并未成真。相反,随着人们对 AI 能力边界的认识逐渐清晰,讨论焦点已转向如何借助 AI 辅助人工,而非完全替代人工。AI 作为一种工具,与人类历史长河中所有工具一样,本质上是人类能力的延伸。如果你觉得在使用过程中遇到了困境,或许应该反思自己看待和使用它的方式是否恰当。
“享受氛围,但不要沉沦其中”。Vibe Coding 作为新兴的编程范式确实让编程更高效也更有趣,但它不应成为我们放弃深入学习和理解技术的借口。理性看待 AI 的能力边界,在提高效率的同时,不忘技术精进的初心。或许未来 AI 能代替我们“敲“代码,但我们必须掌握思考和创造的主动权。
欢迎 点赞、 转发
在日常生活里,人们经常需要在各种度量衡单位之间转换。对开发者而言,实现这类功能看似简单:写几行公式、做几次 switch
,似乎就能完成任务。但当你希望同时支持数十种单位、无缝国际化,并且还要考虑格式化、精度、舍入等细节时,工作量立刻飙升,且枯燥到足以让人怀疑人生。好消息是——从 iOS 10 起,苹果在 Foundation 中加入了完善的 Measurement API,帮我们把这一切“苦力活”都完成了。本文将带你系统地了解它的用法与实践。
每年五月的第三个星期四是全球无障碍宣传日 (GAAD)。尽管苹果为无障碍开发提供了完善的 API 体系,许多开发者依然因为“看起来太麻烦”而忽略了这块用户体验的基础工程。在这篇文章中,作者 Edvinas Byla[7]回顾了自己为十年前的游戏 Decrypto补上 VoiceOver 支持的全过程——通过 SwiftUI 的无障碍 API,他完成了从“完全忽略”到“主动设计”的认知转变。Byla 指出,大多数 SwiftUI 控件本身已经具备良好默认行为,而常见的几个修饰符就能覆盖 90% 以上的无障碍需求。这篇文章不仅是一个 VoiceOver 实践案例,也是一份关于“为所有人设计”的真诚倡议。
虽然 SwiftPM 的 .binaryTarget
是闭源 SDK 分发的常见手段,但其无法声明依赖一直是个公认的痛点。Daniel Saidi[9]在实践中探索出了一种可行的绕过方式 —— 通过在包中添加多个 binaryTarget
,并将它们同时列入产品的 targets
,实现间接的依赖注入。尽管这种方式尚未验证是否适用于普通源码包,但对于闭源组件的 Swift 包依赖管理来说,这无疑是一个值得关注的重要突破。
在 SwiftUI 中,如果一个视图既需要拥有 ViewModel 的生命周期,又希望根据传入参数初始化它,就可能触发一系列状态管理的陷阱和隐性 bug。Chris Eidhof[11]在本文中分析了这些问题,并展示了从错误实现到渐进式修复的全过程。他总结出一条重要的实践经验:“如果你无法在声明时初始化 @State
,或无法将其设为 private
,那你很可能在设计上出了问题。”
如果你不爱写测试,本文也许能为你“辩护”:不是你懒,而是工具不给力。Karin Prater[13]系统梳理了苹果开发生态中各类测试工具的优劣,指出 SwiftUI 虽革新了 UI 构建方式,却在可测试性方面严重缺位。Prater 提出构建良好 SwiftUI 测试体验所需的六个关键维度:速度、稳定性、反馈、交互、精确断言与可维护性。在后续文章中,作者还将分享一个可实际落地的 SwiftUI 测试模式,值得关注。
尽管 SwiftUI 越发成熟,仍有不少开发者渴望用纯 AppKit 代码(不依赖 Xcode GUI 工具)构建原生 macOS 应用。这正是 Luna Razzaghipour[15]在《Cocoa Basics》系列[16]中要做的事:不用模板、不靠 IDE,全程只写代码。教程从构建最小可运行的 Cocoa 应用入手,手动搭建 .app
bundle 结构,并使用命令行工具完成编译与运行。
macOS 应用在启动的短短几秒内就可能生成数万条日志,分析起来既费力又低效。Howard Oakley[18]在本文中展示了如何借助他开发的工具 LogUI[19],通过多窗口并行搜索同一日志视图中的不同关键词,分阶段拆解和追踪 app 启动过程中的关键事件,大大提升了日志分析的可读性与效率。
xtool
是一个跨平台的 Xcode 替代方案,支持在 Linux、Windows 和 macOS 上使用 SwiftPM 构建和部署 iOS 应用。它不仅打破了 macOS/Xcode 的平台限制,还集成了与 Apple Developer Services 和真实设备交互的能力,非常适合用来探索 Swift 跨平台开发、自动化打包和远程部署的可能性。项目还提供了清晰易懂的 入门教程[21],可以快速上手。
Godot 是一款广受欢迎的开源游戏引擎,最近还获得了 Apple 对其在 visionOS 上运行的官方支持。而 Xogot 则进一步拓展了它的使用场景 —— 这是一个将 Godot 4.4 完整移植到 iPad 的原生应用,现已登陆 App Store[23]。Xogot 支持在 iPad 上直接运行和调试 Godot 项目,内置 2D/3D 场景编辑器、代码编辑器、调试器等全套工具,并针对触控操作、Apple Pencil 和多窗口使用场景进行了优化。整个 UI 基于 SwiftUI 重写,体验上更贴近 iPadOS 的原生范式。
最初作为一款聚焦 Apple 生态内容汇总与技术资料管理的开源项目 SwiftPamphletApp[25],如今在作者 戴铭[26]的推动下迎来 6.6.7 版的重大更新:正式更名为《小册子》,并完成从“开发工具箱”到“知识宇宙”的转型。新版小册子融合了代码技巧、人文思考、历史纵览与播客拓展阅读,是一个集“技术资料 + 知识花园 + 灵感收纳”为一体的现代数字笔记应用,满足碎片学习、深度阅读与兴趣探索的多重场景。
应用代码依然保持开源,并可从 App Store[27]下载体验。
参考资料
[1]
weekly.fatbobman.com: https://weekly.fatbobman.com
[2]
肘子的 Swift 记事本: https://fatbobman.com
[3]
Discord: https://t.ly/gzxeh
[4]
从 180 cm 到 5′ 11″:Swift Measurement 全解析: https://fatbobman.com/zh/posts/a-complete-guide-to-swift-measurement/?utm_source=fatbobman%20weekly%20issue%2083&utm_medium=web
[5]
【Tip】将访问权限控制在 Swift Package 内: https://fatbobman.com/zh/snippet/controlling-access-within-a-swift-package/?utm_source=fatbobman%20weekly%20issue%2083&utm_medium=web
[6]
十年后,我为游戏加上了无障碍支持 (Ten Years Older, Voice Takes Over): https://l.fatbobman.com/w083-01
[7]
Edvinas Byla: https://www.linkedin.com/in/byla/
[8]
给二进制 Swift 包加上依赖的变通法 (Adding Dependencies to Binary Swift Packages): https://l.fatbobman.com/w083-02
[9]
Daniel Saidi: https://x.com/danielsaidi
[10]
SwiftUI 中的 ViewModel 生命周期管理 (SwiftUI View Model Ownership): https://l.fatbobman.com/w083-03
[11]
Chris Eidhof: https://m.objc.io/@chris
[12]
为什么我们总是不想写 iOS 测试?(Why We Keep Avoiding Tests in iOS): https://l.fatbobman.com/w083-04
[13]
Karin Prater: https://x.com/swiftyplace
[14]
Cocoa 入门手册 (Cocoa Basics): https://l.fatbobman.com/w083-05
[15]
Luna Razzaghipour: https://github.com/lunacookies
[16]
系列: https://blog.xoria.org
[17]
用 LogUI 多窗口搜索提高日志分析效率 (Reducing Noise by Searching LogUI’s Views): https://l.fatbobman.com/w083-06
[18]
Howard Oakley: https://x.com/howardnoakley
[19]
LogUI: https://eclecticlight.co/2025/03/14/browse-your-macs-log-with-logui/
[20]
xtool: https://l.fatbobman.com/w083-07
[21]
入门教程: https://swiftpackageindex.com/xtool-org/xtool/1.10.1/tutorials/xtool/first-app
[22]
Xogot: https://l.fatbobman.com/w083-08
[23]
App Store: https://apps.apple.com/us/app/xogot-make-games-anywhere/id6469385251
[24]
戴铭的小册子: https://l.fatbobman.com/w083-09
[25]
SwiftPamphletApp: https://github.com/ming1016/SwiftPamphletApp
[26]
戴铭: https://x.com/daiming_cn
[27]
App Store: https://apps.apple.com/cn/app/戴铭的小册子/id1609702529
[28]
查看职位详情: https://www.zhipin.com/job_detail/0e1d7bd9ab6584f403V63ti8E1NT.html?utm_source=fatbobman%20weekly%20issue%2083&utm_medium=web
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有