阅读视图

发现新文章,点击刷新页面。

春晚、机器人、AI 与 LLM -- 肘子的 Swift 周报 #124

issue124.webp

春晚、机器人、AI 与 LLM

作为一个观众数量超十亿的电视节目,央视春晚无疑是极佳的展示平台。今年春晚中,多家中国机器人厂商在不同节目中展示了其产品,其中讨论度最高的当属宇树(Unitree)的人形机器人。在表演环节,多款型号的人形机器人完成了大量较为复杂的武术与动态动作展示。与去年偏静态、偏站桩式的呈现相比,今年的动作复杂度与稳定性确实有明显提升,这一点也得到了全球媒体的关注与报道。

春晚之后,社交媒体上的讨论呈现出明显分化。除了对技术进步的惊叹之外,“预编程”、“没有 AI”、“缺乏实用性”等质疑声音同样不少。这在一定程度上反映了公众对机器人技术复杂度的低估——尤其是对运动控制、实时反馈系统和系统级整合难度的认知不足。

需要澄清的一点是:预训练并不等于“录制-回放”。当前人形机器人在此类表演中的确采用了高度规划的动作流程,这与人类舞者、运动员的训练逻辑有相通之处——大量的离线训练与调试构成了动作的基础,但在实际执行过程中,身体仍需依赖动态平衡与即时修正来应对真实环境的扰动。正是这种容错与实时修复能力,才让人形机器人这个天然不稳定的双足系统得以完成高动态的连续动作。

与此同时,近年来大语言模型(LLM)的爆发,让不少人将 LLM 与 AI 等同起来。事实上,AI 作为一个已有数十年发展的领域,远远不止语言理解这一分支。尤其是面对真实的物理世界时,视觉识别、路径规划、运动控制、强化学习等专用模型在工业与实体系统中的使用量,依然远高于 LLM。在机器人领域,真正决定能力上限的往往是感知系统、控制系统以及低延迟反馈算法,而不是语言推理能力。

即便未来为人形机器人引入更强的"认知能力",更适合的路径也未必是直接接入 LLM,而可能是构建能理解物理规律的世界模型(World Models)与具备低延迟响应能力的控制系统——这两点恰恰是 LLM 的固有短板。具身智能(Embodied AI)的挑战,与纯文本推理存在本质差异。

至于“实用性”的问题,功夫或舞蹈确实难以直接对应现实工作场景。但恰恰是这些对平衡性、协调性与动态响应要求极高的动作,为人形机器人这种高度复杂且不稳定的系统提供了极佳的验证场景。它们更像是工程能力的压力测试,展示的是机械设计、电子控制与算法系统整合的成熟度,而非短期商业落地能力。

我个人对于人形机器人未来的市场规模仍然持审慎态度。技术进步与商业普及之间往往存在不小的鸿沟。但从今年春晚所呈现的进步幅度来看,可以合理判断:在未来十年内,机器人或智能机器以某种形式融入日常工作与生活场景,已不再是科幻想象。无论你是否喜欢“机器人”,技术演进的趋势已经十分明确,我们终将需要与它们共存。

至于“机器人奴役人类”的情景,我暂时并不担心。我更现实的担忧是:如果它们在工作中出现 Bug,给我一拳,我真的挨不住。

本期内容 | 前一期内容 | 全部周报列表

🚀 《肘子的 Swift 周报》

每周为你精选最值得关注的 Swift、SwiftUI 技术动态

近期推荐

如何在不破坏 App 的前提下迁移到 @Observable (How to Migrate to @Observable Without Breaking Your App)

随着越来越多的应用将最低系统版本提升至 iOS 17,@Observable 正在取代 ObservableObject 成为新的状态管理基础设施,但当项目已经深度依赖 ObservableObject + @Published 时,迁移远非简单替换宏即可完成。Pawel Kozielecki 结合一次真实的迁移踩坑经历,从底层机制差异出发,系统梳理了新体系下属性包装器的正确使用方式——用 @State 管理生命周期、用 @Bindable 处理双向绑定、只读场景直接使用普通属性,并特别指出了 @ObservationIgnored、计算属性追踪盲点等容易被忽视的细节。迁移的难点从来不在语法层面,而在于真正厘清“谁拥有 view model 的生命周期”这一根本问题。


验证多个回调按顺序触发 (Testing with Event Streams)

尽管 Swift Testing 提供了丰富的断言 API,但在实际使用中你会发现,并没有一个工具能够完全对应 XCTest 中“验证多个回调按顺序触发”(fulfillment + enforceOrder)的能力。confirmation 既需要嵌套使用,也无法直接校验触发顺序。对此,Matt Massicotte 提出了一种更符合 Swift 并发模型的思路:使用 AsyncStream 收集事件,并封装为一个轻量级的 EventStream 类型——当回调触发时 yield 事件标识,测试结束后通过 collect 获取完整事件序列,再与预期数组进行对比。对于“为什么不直接使用数组”这一疑问,Matt 也给出了充分理由:在存在 @Sendable 约束或 actor 隔离不一致的场景下,直接写入数组会触发并发安全问题,而基于 AsyncStream 的方案则天然符合并发模型的约束。


务必为 SwiftData 模型显式声明 Schema 版本 (If You’re Not Versioning Your SwiftData Schema, You’re Gambling)

SwiftData 的声明式写法与自动迁移能力很容易让人产生“框架会替我处理一切”的错觉,但现实是,一旦模型结构发生变化(字段新增、重命名、关系调整),如果没有显式的 schema version 与 migration plan,就只能依赖隐式推断。一旦推断失败,结果往往不是优雅的迁移,而是崩溃、数据丢失,甚至导致应用无法启动。Mohammad Azam 的建议直接而务实:显式声明 Schema 版本;为未来的结构变化预留迁移路径;将“迁移设计”视为模型设计的一部分,而不是事后补救。

本文的观点同样适用于 Core Data。即便模型完全兼容轻量迁移,为每个发行版本创建对应的模型版本文件(只要发生结构修改),不仅有助于追踪模型演化轨迹,也能在出现问题时实现清晰而可控的回滚。用明确的版本机制约束模型演进,本质上是在为长期维护建立安全边界。


用 Swift 开发 CLI 工具 (How to build a simple CLI tool using Swift)

一个有趣的现象是,在 AI Coding 时代,CLI 正在重焕青春——越来越多的开发者通过构建 CLI 工具来承载自己的 MCP 与 Agent 工作流。Natascha Fadeeva 介绍了如何用 Swift Package Manager 和 Apple 官方的 ArgumentParser 库构建结构化的命令行工具:定义主命令与子命令、处理异步网络请求、最终编译为可独立分发的二进制文件。对于已经熟悉 Swift 的 iOS 开发者来说,这条路径比维护一套 bash/Python 脚本更自然,也更容易随项目一起演进。


在 AI 编程时保持方向感 (Navigation Notes – Agentic coding)

作为一个拥有丰富经验的开发者,Joseph Heck 认为当 AI 能够主动执行任务、生成代码甚至推动改动时,开发者的角色从“逐行实现者”转变为“路径规划者”。真正稀缺的能力不再是写代码的速度,而在“导航”——也就是开发者在复杂代码与多代理环境中如何保持方向感。Joseph 给出了几条建议,例如:在提示词中始终加入"对任何模糊之处向我提问";先让 Agent 制定计划并获得确认,再开始实施;提供确定性的反馈回路(单元测试、编译器错误),让 Agent 能够自我修正;以及将反复使用的指令集沉淀为 Skill 文件等。

Heck 并没有过度渲染“AI 颠覆开发者”的叙事,而是强调一种更冷静的现实:agentic coding 会放大已有的工程能力。如果你本来就善于模块划分与抽象设计,AI 会加速你;如果边界感模糊,AI 只会更快制造混乱。


为 Agent 驱动的 iOS 项目构建可靠交付管线 (Setting up a delivery pipeline for your agentic iOS projects)

当代码的生成、修改与重构开始由 Agent 驱动时,传统的 CI/CD 流程是否仍然足够?Donny Wals 以一次真实经历展开:健身时应用崩溃,他将 Crash Report 交给 Agent 分析,训练结束后 PR 已经准备就绪,合并后 TestFlight 构建随即落地。围绕这一实践,他系统梳理了如何为“agentic iOS 项目”构建一条可靠的交付管线(delivery pipeline),确保自动化改动依然可控、可验证、可发布。

文章的重点并不在某个具体工具,而在流程设计本身。Donny 强调,Agent 生成的代码本质上仍属于“未经人工逐行审查的改动”,因此更需要明确的边界与质量闸口:自动化测试、持续集成与发布流程必须承担最终的交付责任。Agent 可以显著提升实现速度,但工程纪律不能随之放松——速度提升之后,控制机制反而更为关键。


实时掌握 Foundation Models 的上下文消耗 (Tracking Token Usage in Foundation Models)

Apple 的 Foundation Models 运行在设备端,上下文窗口仅 4096 个 token,一旦超出便无法继续对话。iOS 26.4 新增了 token 用量追踪 API,帮助开发者实时掌握上下文消耗情况。Artem Novichkov 系统介绍了四个关键指标:模型上下文总容量(contextSize)、Instructions 的 token 消耗、单条 Prompt 的消耗,以及完整对话记录(Transcript)的累计用量。文章还揭示了一个容易被忽视的细节:当引入 Tool 时,其名称、描述与参数 Schema 会被序列化并计入 token,同一段 Instructions 在附加 Tool 后 token 数从 16 跃升至 79。对于设备端模型而言,token 的可观测性将成为优化体验的基础设施。

工具

App Store Connect CLI

App Store Connect CLI 是由 Rudrank Riyam 开发的非官方 App Store Connect 命令行工具,功能覆盖 TestFlight 管理、构建上传、代码签名、截图自动化、本地化同步、应用审核提交、notarization,以及财务报告下载等完整发布链路。它从设计阶段就强调 Agent 场景,并提供了面向 Agent 的实践文档。若你的发布流程重心在 TestFlight、元数据、提审、签名与 CI 自动化,ASC 可以作为 fastlane 的轻量替代方案之一。


GRDB 7.10.0: 新增 Android、Linux、Windows 支持

GRDB 7.10.0 是一个具有里程碑意义的版本更新:本次正式引入对 Android、Linux、Windows 的支持,并新增通过 Swift Package Manager 使用 SQLCipher(加密数据库)的能力——这两项功能都长期受到社区期待。这意味着这个 Swift 生态中最成熟的 SQLite 封装库,正在从 Apple 平台工具演进为真正的跨平台数据层解决方案。

Gwendal Roué版本公告 中也特别说明,由于 Xcode 尚未支持 package traits,SwiftPM 目前仍会下载未实际使用的依赖;在相关问题解决之前,SQLCipher 支持将以 fork 形式长期维护。


Swift System Metrics

Swift System Metrics 为 Swift 应用(尤其是服务端项目)提供了统一的系统级指标采集能力,例如 CPU 使用率、内存占用、文件描述符数量等,并通过标准化的 Metrics 接口对外暴露,便于接入 Prometheus 等现有监控体系。它并非一个独立的监控系统,而是由 Swift Server Work Group 推动的基础设施组件,旨在与 Swift Metrics 生态对齐,使系统资源指标与应用级指标纳入同一可观测体系。1.0 的发布意味着 API 已趋于稳定,具备生产环境使用条件。对正在构建 Swift 后端服务、或持续完善 Swift 可观测性能力的团队来说,这是一个基础设施层面的关键拼图。

往期内容

💝 支持与反馈

如果本期周报对你有帮助,请:

  • 👍 点赞 - 让更多开发者看到
  • 💬 评论 - 分享你的看法或问题
  • 🔄 转发 - 帮助同行共同成长

🚀 拓展 Swift 视野

祝大家马年新春快乐! -- 肘子的 Swift 周报 #123

issue123.webp

祝大家马年新春快乐!

今年的中国农历年是丙午年,是一个60年一遇的“赤马年”。

在干支纪年中,天干“丙”与地支“午”五行皆属火,双火叠加,形成了极为罕见的“火马”格局。因火色为赤,故此马年又称“红马年”。这匹“红马”承载着最纯粹的阳刚之气与蓬勃活力,预示着接下来的一年将充满奔放的能量与昂扬的进取心。

在这个 60 年一遇的吉庆节点,我在此祝各位读者新的一年:身体健康(CPU 满血),事业驰骋(性能优化),万事顺遂(无 Bug 运行),马到成功(编译通过)! 🎉

本期内容 | 前一期内容 | 全部周报列表

🚀 《肘子的 Swift 周报》

每周为你精选最值得关注的 Swift、SwiftUI 技术动态

近期推荐

Swift 并发进阶阅读路线图 (Swift Concurrency from Zero to Hero | Reading List)

暂不说 AI 目前还很难像专家一样处理 Swift 6 并发相关的复杂代码,即便工具能力突飞猛进,作为使用者的你也不该只当旁观者:系统、全面地理解 Swift 并发的概念、用法与历史脉络,才能从源头构建更安全、更强健的应用。Alex Ozun 在本文中按难度划分关卡,整理了一份“从入门到进阶”的 Swift Concurrency 阅读路线图:每一关都配套了公开且免费的参考资料,难度也会逐级递增,希望你在完成这条主线之后,能从 Zero 走到 Hero。


15 步打造现代 iOS 项目 (A Modern iOS Project Setup in 15 Steps)

对于不少开发者而言,新项目的开始往往伴随着重复而琐碎的配置工作。Ertem Biyik 在这条串贴中用 15 个步骤梳理了一套现代 iOS 项目的工程化基线:以 Tuist 为核心管理依赖与生成,通过 xcconfig 统一环境配置与构建参数,借助 Makefile 简化初始化流程,并在 GitHub Actions 中完成 lint 与构建校验;同时,他还建议使用 AGENTS.md 统一 AI 上下文,并配合 sosumi.ai 获取更利于 LLM 阅读的 Apple 文档。


Micelio:后 Git 时代的代码托管工具 (Micelio: Growing Software Like Nature Grows Forests)

AI 深度参与开发流程后,许多传统工具开始显露出“水土不服”。Pedro Piñera 以“菌丝网络(mycelium)”为隐喻,指出随着 AI agent 参与开发的规模与频率不断提升,Git 这种只记录 what changed、却难以保留 why it changed 的历史模型,正在变得不够充分。本文是他对“后 Git 时代”的一次系统性思考,也是对“agent-first 协作方式”的公开实验。配套的开源 git forge Micelio 项目尝试以 session 为核心单元捕获上下文与推理,将代码托管的重心从“存 diff”转向“存决策”。项目仍处于早期阶段,但其问题意识与工程方向,都值得持续关注。


Swift 写时复制 (Copy-on-Write in Swift - How It Works and Why It Optimizes Memory)

写时复制(COW)是 Swift 的核心机制之一,也是值类型在保证语义一致性的同时获得良好性能的关键。Sagar Unagar 结合集合类型的内部实现,解释了 Swift 如何通过“结构体外壳 + 引用存储”的方式实现读共享、写分离:只有在发生写入且检测到非唯一引用时,才会借助 isKnownUniquelyReferenced 触发真正的拷贝。文章同时展示了自定义类型实现 COW 的基本模式。


Metal Shader 入门 (Taking First Steps into Metal Shaders)

对于大多数 SwiftUI 开发者而言,Metal 往往显得遥远而复杂。Letizia Granata 通过本文带你从 0 开始接触 Shader:从理解 GPU 与 CPU 的分工,到在 Xcode 中添加 .metal 文件,再到编写并在 SwiftUI 中应用一个最简单的 shader 效果。Letizia 没有深入渲染管线或图形学细节,而是聚焦“如何真正跑起来”,帮助读者跨过入门门槛。


为 Landmarks 构建 Vapor 后端 (Setting Up a Backend Server for Our Landmarks App)

Landmarks 是 Apple 在 SwiftUI 教程中提供的经典示例应用,但由于它使用本地 JSON 数据,与真实项目的客户端—服务器架构仍存在差距。Kyle Browning 使用 Vapor 为 Landmarks 构建了一个简单的后端服务,将静态示例升级为通过 API 获取数据的完整结构。文章围绕模型定义、路由配置、数据响应以及与 SwiftUI 前端的对接展开,重点不在复杂业务逻辑,而在于示范如何把一个“教学示例”扩展为更贴近真实世界的项目。


Spotlight 后台索引机制解析 (In the Background: Spotlight Indexing)

系统更新后的几天里机器发热、卡顿,很多人都知道这与 Spotlight 的重新索引有关,但它在后台如何扫描文件、何时触发重建索引、又如何调度系统资源,却鲜少被系统性梳理。Howard Oakley 基于日志与实测数据,对 Spotlight 索引的触发机制、进程行为以及对 I/O 与性能的影响进行了细致分析,提供了一次关于 macOS 内部运行机制的深入技术观察。

工具

ScreenStateKit:并发时代的 MVVM 演进

如果你欣赏 TCA 的单向数据流与可预测状态管理,却又不想在现有 MVVM 项目中彻底重构架构,那么 ScreenStateKit 状态管理库也许是一个折中方案。作者 Anthony Tran 将传统 ViewModel 拆分为两个职责清晰的部分:一个运行在 @MainActor 上、只负责持有 UI 状态的 ScreenState,以及一个以 Swift actor 实现、专门处理业务逻辑与异步任务的 ScreenActionStore,所有状态变更都通过强类型 Action 作为唯一入口,从而在保持 MVVM 结构直观性的同时,引入类似 TCA 的单向数据流与编译期并发安全。配合内建的加载与错误状态管理、重复请求防护(ActionLocker)、父子状态传播与分页支持。Anthony 亦撰写了一篇详尽的设计说明文章,对其架构理念与实践细节进行了系统阐述。


GitHub 子目录下载工具

如果你曾为了下载 GitHub 上的某个示例目录而被迫 git clone 整个仓库,这款 GitHub Downloader 显然正是为此而生。它是 Stewart Lynch 开发的一款原生 macOS 应用,允许你粘贴任意 GitHub 仓库或子目录 URL(包括 tree/branch/path 形式),自动识别默认分支,递归下载所选目录内容,并完整保留其原始层级结构。


SimTag:为模拟器标注分支上下文

在并行开发成为常态的今天,面对多个外观几乎相同的 iOS Simulator,开发者很容易迷失:到底哪个分支正在运行?是否调试了错误的构建版本?Aryaman Sharda 开发的 SimTag 会在每个 Simulator 窗口上叠加一个轻量标识,显示当前构建对应的 git 分支与提交信息。对于习惯使用 worktrees、进行 PR 审查或结合 AI 协作开发的团队来说,这是一个能够显著减少认知摩擦、避免“调错分支”的实用小工具。

往期内容

💝 支持与反馈

如果本期周报对你有帮助,请:

  • 👍 点赞 - 让更多开发者看到
  • 💬 评论 - 分享你的看法或问题
  • 🔄 转发 - 帮助同行共同成长

🚀 拓展 Swift 视野

Xcode 迈入 Agent 时代 -- 肘子的 Swift 周报 #122

issue122.webp

Xcode 迈入 Agent 时代

尽管在 Xcode 26 的最初版本中,苹果就已经加入了一定的 AI 辅助编程能力,但当时的体验更像是把 ChatGPT 生硬地嵌入到 IDE 中:功能存在,却彼此割裂。与当时风头正盛的 Cursor 相比,它更像是两个时代的产物。随着 Claude Code 等 AI CLI 工具逐渐成熟,Xcode 更显得步伐迟缓,甚至让不少开发者开始怀疑:在 AI 时代,它是否还能胜任“主力 IDE”的角色。

26.3 版本的到来,几乎没有任何预热,却用实际行动回应了这些质疑。通过集成 Claude Code / Codex,苹果给出的答案很直接:只要策略得当,Xcode 依然是苹果生态中极具潜力的开发环境。这一次,Xcode 并没有简单地塞进一个 CLI 工具面板,而是引入了一套原生的 Xcode Tools(MCP),并配合 Swift 6、SwiftUI、SwiftData 等官方技术文档,形成了高度一致、贴合最新实践的整体体验。即便对于已经熟练使用 CLI + XcodeBuildMCP + 各类 Skills 的开发者而言,这套原生方案依然具备很强的竞争力——尤其是几乎为零的配置成本,这对绝大多数开发者来说意义重大。

更值得注意的是,这次提供的 Xcode Tools 并不只是服务于 Xcode 本身,它们同样可以作为标准 MCP,为其他 AI 工具提供能力支持。这种开放姿态,并不完全符合外界对苹果一贯风格的印象。

当然,站在今天这个时间点,我们还不能断言 Xcode 已经重新回到了第一阵营。但可以肯定的是,26.3 释放了一个非常明确的信号:苹果愿意与主流工具和服务协作,去打造真正符合时代的开发体验。也正因为如此,我对下一阶段的 Siri 抱有更高的期待——很可能在 iOS 27 中,苹果会在现有 Intent 体系之外,为系统和应用提供更多标准化接口,让 AI 更自然地融入整个生态。

Xcode + Agent 只是起点。

Apple + Agent,才是更值得关注的未来。

本期内容 | 前一期内容 | 全部周报列表

🚀 《肘子的 Swift 周报》

每周为你精选最值得关注的 Swift、SwiftUI 技术动态

原创

Xcode 26.3 + Claude Agent:模型替换、MCP、Skill 与自适应配置

Xcode 26.3 版本中苹果直接提供了对 Claude Code/Codex 的支持。自此,开发者终于可以在 Xcode 中方便的使用原生 AI Agent 了。 这两天我针对新版本进行了一系列尝试,包括如何使用最新模型、配置 MCPs/Skill/Command、以及编写自适应的 CLAUDE.md。本文以 Claude Code 为例,分享一些文档之外的技巧。

近期推荐

macOS 录屏软件开发实录:从像素抓取到元数据重现

视频正在取代文字成为更受欢迎的表达方式,而好工具是创作的加速器。macOS 录屏软件 ScreenSage Pro 的开发者 Sintone 深度复盘了如何基于 ScreenCaptureKit 和 Metal 实现“录完即剪完”。从解决 SCK -3821 诡异报错,到由 ObservableObject 迁移至 @Observable 优化时间线性能,本文毫无保留地分享了从像素抓取到高性能合成的全过程。


哪种方式判断字符串是否在白名单里最快:Set、Array、Enum、Dictionary 还是 switch?

在 Swift 里,判断一个字符串是否属于某个键集合,可以写成 Set.containsArray.contains、RawRepresentable enum 的 init?(rawValue:)switch 多分支,甚至用 Dictionary 来做映射。看起来差别不大,但真要放进性能敏感路径,结果可能并不完全符合直觉。Helge Heß 做了一次简单的基准测试:Set.contains 毫无悬念地领先,其次是 enum(rawValue:)Dictionary(两者非常接近);而很多人下意识会高估的 switch,反而排在 enum 之后,Array.contains 则垫底收场。作为一个小实验,这个结果或许正好可以拿来校准一下我们对 Swift 性能的直觉。


从一次性付费到 Freemium (Migrating an iOS app from Paid up Front to Freemium)

付费下载和免费 + 应用内购买是两种截然不同的商业模式,随着应用发展,开发者可能需要在两者之间转换。Donny Wals 在本文中分享了他将 Practical Core Data 应用从 $4.99 付费下载转为 freemium 的完整经历。文章不仅涵盖了 StoreKit 2 的技术实现细节(购买流程、状态管理、家庭共享),更有价值的是他对商业决策的深入思考:付费门槛虽然能筛选出认真的用户,但也阻挡了大量潜在用户体验产品价值的机会。对于教育类或工具类独立应用,freemium 可能是用户增长和收入之间更好的平衡点。


iOS 应用中的按需资源 (On-demand resources in iOS app)

应用体积一直是开发者需要关注的问题,尤其是在应用包含大量图片、音频或其他资源时。尽管苹果很早就在 iOS 中提供了 On-Demand Resources(ODR)来应对这一挑战,但这一功能的存在感并不强,常被开发者忽略。在本文中,Majid Jabrayilov 系统性地回顾了 ODR 的工作机制与使用方式,包括资源分组、标签管理、下载生命周期,以及与系统缓存策略之间的协作关系。

虽然苹果在推广 Background Assets 作为更现代的方案,但 ODR 在需要即时响应的按需下载、细粒度资源控制等场景下仍有其独特价值。


Observation 四个常见陷阱 (Objectively Better, Observably Trickier)

在全面拥抱 Observation 框架时,开发者需要警惕其工作机制与 Combine 的 @Published 并不相同,简单替换往往会引入隐蔽的问题。Danny Bolella 总结了迁移过程中四个常见陷阱:@State 持有引用类型时的非惰性初始化、嵌套 @Observable 对象导致的更新丢失、数组元素绑定方式的变化,以及与其他属性包装器产生的冲突。文章通过清晰的代码示例逐一给出解决方案,并反复强调一个核心原则:只有视图当前正在访问(调用 getter)的属性发生变化时,才会触发更新。理解并顺应这种“惰性观察”的思维方式,是正确使用 Observation 框架的关键。


在 macOS 应用中实现 Open Recent 菜单 (Add an Open Recent Menu to a SwiftUI app)

“Open Recent” 是 macOS 应用的标准功能,但对于 SwiftUI 开发者来说,正确实现这个功能并不直观。在本文中,Mark Szymczyk 通过一个简洁的示例,展示了如何利用 NSDocumentController 为应用接入系统级的最近文件管理能力:自动维护列表、更新菜单,以及与文档生命周期的无缝协作。对于文档型或工具类应用,这是一个低成本、却能明显提升“原生感”的细节优化。

工具

Radioform:一个原生、开源的 macOS 音频均衡器

macOS 一直缺少系统级的音频均衡器,由 Matthew Porteous 开发的 Radioform 填补了这个空白。该项目采用 SwiftUI 菜单栏 App + Swift Host + CoreAudio HAL Driver + C++ DSP 的分层架构,把 UI 与实时音频处理彻底解耦。DSP 部分实现了 10 段参数 EQ、参数平滑、限幅与实时安全控制;工程上也有完整 CI、签名公证与 DMG 发布流程。不是“能跑就行”的 Demo,而是接近可长期维护的生产级音频工程样板。


CircuitPro:macOS 原生的 PCB 设计工具

这是一个 macOS 原生应用较少涉足的领域:PCB 设计。CircuitPro 是一款面向 macOS 的 PCB EDA 工具,目标是把原理图、布局与元件库流程做成更符合 Apple 平台习惯的体验。(项目仍处于早期开发阶段)

项目里最吸引我的是自研的 CanvasKit。它更像一个面向 EDA 场景的 2D 交互引擎,而不只是普通画布组件:上层是声明式 CanvasView,中层是状态中枢 CanvasController,底层是输入路由、渲染树与工具系统。更关键的是,吸附、输入处理、连线引擎都被做成了协议化插拔点,让原理图和布局共享同一基础设施,同时保留各自的路由规则。

即便你对 PCB 设计本身不感兴趣,CircuitPro 也很值得关注,尤其是它在 SwiftUI + AppKit 融合架构上的工程实践。

求贤

了解二次元的 iOS 工程师

本公司是二次元文生图头部企业(总部新加坡),招聘岗位为大陆全职 remote。求职者需要了解二次元文化,懂得二次元用语(黑话)。

岗位职责 (Responsibilities):

  • 我们正在寻找一位经验丰富的 iOS 工程师(中高级),负责主导我们 iOS 应用的开发与优化工作。

  • 理想的候选人应具备深厚的 Swift 技术功底,出色的测试与团队协作能力,并拥有现代 iOS 架构及工具链的实战经验。

任职要求 (Requirements):

  • 3 年以上 iOS 开发经验,主要使用 Swift,同时具备一定的 Objective-C 代码维护能力。

  • 至少 1 年的 SwiftUI 和 SPM (Swift Package Manager) 实战经验,熟悉其生态系统及最佳实践。

  • 熟悉 iOS 15+ 新特性,能够针对不同的 iOS 版本和设备屏幕尺寸进行适配及性能优化。

  • 掌握单元测试和 UI 自动化测试 (XCTest, XCUITest),有能力编写可维护的代码,以确保项目的稳定性和可扩展性。

  • 精通 Git 工作流(Git Flow, 主干开发/Trunk-Based Development),并具备基本的代码审查 (Code Review) 技能。

  • 理解基础的 iOS 应用模块化设计、多种单页面架构模式以及性能优化方法,并具备在项目中落地的能力。

加分项/优先考虑 (We will give priority to who):

  • 拥有跨平台开发经验(满足以下任意一项即可):

  • 6 个月以上的任意前端技术栈经验 (TypeScript/JavaScript, React, React Native)。

  • 6 个月以上使用 Kotlin 及相关框架的 Android 开发经验。

  • 6 个月以上的任意后端开发框架经验。

  • 拥有至少 6 个月的 iOS 基础设施工具或框架搭建经验,包括代码质量提升(Linting, 静态分析, CI/CD)、效率优化(模块化,Gradle 组件化*)、以及性能调优(启动速度、帧率、离线模式、多线程)。

  • 拥有 1 年以上 SDK 开发经验,包括通用库开发,如图片加载库 (SDWebImage, Kingfisher)、富文本编辑器、网络层或持久化层 (SQLite, Realm, Core Data)。

  • 具备 UI/UX 相关经验

  • 熟悉 Apple 人机交互指南 (HIG),能够在理解跨平台设计差异的同时,实现符合 Apple 设计标准的 UI。

  • 拥有扎实的动画和交互动效开发经验,熟悉 Core Animation, UIKit Dynamics 等。

  • 深色模式 (Dark Mode) 及主题切换功能的开发经验。

  • 具备极强的审美感知力,拥有绘画、摄影或设计相关的技能或爱好(附带作品集者优先)。

  • 拥有完整的 App 生命周期经验:曾独立开发、发布并维护过支持多国/多语言的 iOS 应用。

  • 积极参与技术社区,例如:

  • 具有主动学习和分享的心态,有进行技术演讲的经验。

  • 有技术写作经验(博客、文章)。

  • 有开源项目贡献经历。

  • 有使用 AI 编程工具的经验,如 Claude, ChatGPT, GitHub Copilot, Cursor 或 Windsurf。

  • 具备流利的英语沟通能力或持有日语 N2 证书。

联系人

xx2bab@gmail.com

往期内容

💝 支持与反馈

如果本期周报对你有帮助,请:

  • 👍 点赞 - 让更多开发者看到
  • 💬 评论 - 分享你的看法或问题
  • 🔄 转发 - 帮助同行共同成长

🚀 拓展 Swift 视野

❌