SPI 加入 Apple,Swift 迈向自举 -- 肘子的 Swift 周报 #142

作者:东坡肘子日期:2026/6/30

SPI 加入 Apple,Swift 迈向自举

几天前,Swift Package Index(SPI)宣布已加入 Apple。双方将共同建设一个面向 Swift 开发者的综合 package registry;与此同时,SPI 现有的包发现、兼容性检查、文档托管等能力仍会继续提供,包作者在短期内也无需调整现有的发布流程。

这也让 #135⁠ 中“SwiftPM 才刚到第二章”的判断得到了新的注脚:CocoaPods 的退场只是把 SPM 推上了默认位置,而 SPI 加入 Apple,才真正揭开了 Swift 包生态基础设施建设的下一幕。

如果说 SwiftPM 解决的是“能不能方便地依赖包”,SPI 解决的是“能不能找到并评估包”,那么这次加入 Apple 则把问题进一步推进到了“能不能可信地发布、识别和分发包”。从中期来看,有三点尤其值得观察:

  • SPI 将从第三方索引服务,演进为官方 package registry 的重要入口;
  • Swift 包生态可能逐步降低对 GitHub 作为托管、分发与身份来源的隐性依赖;
  • Xcode 有机会与 SPI 的搜索、兼容性检查和文档能力建立更紧密的集成。

上周,另一件让 Swift 开发者振奋的事情是,Erik Eckstein 在 Swift 论坛上宣布,Swift 项目将取消“必须能够仅使用 C++ 宿主工具链构建编译器”的要求。换句话说,从 main 分支开始,构建 Swift 编译器将需要已有的 Swift 工具链参与;这也使得编译器中那些过去必须保持 C++ 实现的强制路径,现在可以逐步用 Swift 编写。官方提到的范围包括 Parser、AST、Type Checker,以及 mandatory SIL passes 等核心部分。

这并不意味着 Swift 编译器已经完全用 Swift 重写,也不意味着 C++ parser 会马上消失。更准确地说,这是 Swift 编译器迈向自举和自托管的重要门槛:Swift 不再只是用于外围工具、可选功能或个别优化 pass,而是可以进入编译器的核心路径。

自举本身并不能简单证明一门语言能力的高低,但它代表了一种工程成熟度:语言、编译器、标准库、包管理器和跨平台构建系统,是否已经强大到足以支撑自身的持续演进。对于一个希望在 Apple 平台之外继续扩展影响力的语言来说,这一步的象征意义和实际价值都不小。

把 SPI 加入 Apple 与 Swift 编译器迈向自托管放在一起看,会发现它们指向的是同一件事:Swift 正在补齐生态基础设施。前者关乎包的发现、身份、签名和可信分发,后者则提升了语言工具链自身的可维护性与演进能力。Swift 能否真正破圈,关键并不只在于 Apple 在其中拥有多大的影响力,而在于 Apple 与 Swift 社区是否能持续展现开放、进取的态度,并把工具链、包生态和跨平台体验打磨到足够完整。就这两件事而言,我愿意保持乐观。

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

近期推荐

在 Apple II 上跑 Swift (Bring Swift to The APPLE II)

Apple II 是苹果早期最重要的产品之一,至今仍影响着许多开发者。很多人都曾在它上面使用 BASIC 或 Apple Pascal,但如果在这台机器上写 Swift,又会是什么体验?Yeo Kheng Meng⁠ 实现了一个 Swift 风格的迷你开发环境 SwiftII,让一台搭载 1 MHz 6502 CPU、64 KB 级别内存的老机器也能编写和运行类似 Swift 的程序。

文章精彩的地方不只是“让 Apple II 跑上类 Swift 语言”,还包括大量围绕硬件限制的工程取舍:有限的内存空间、语言卡和 ProDOS 的冲突、不同 Apple II 机型的键盘与显示差异,以及为什么最终要拆成多张磁盘镜像发布。作者也坦诚分享了 AI 辅助开发的过程。即便有 Claude Code 和 Codex 的帮助,关键的架构取舍、范围控制和硬件测试策略仍然需要作者自己把关。本文既有复古计算机的工程细节,也有现代语言设计在极小环境中的取舍。


基于 WebAssembly 实现 Swift App 热更新 (Building an over-the-air update system for native Swift with WebAssembly, from scratch)

为原生 Swift iOS App 构建 OTA 更新机制,是一个有争议但也很有价值的方向。Jack Solomon⁠ 在这篇文章中展示了基于 WebAssembly 的实现思路:将 Swift 函数编译成 WASM,再通过 WasmKit 在 iOS App 内加载执行,随后从服务器下载新的 WASM 模块,让 App 在不重新构建、不替换已签名二进制的情况下改变运行结果。

文章拆解了 Swift to WASM 的工具链、WASI、@_cdecl 导出、reactor module、线性内存传参,以及 SwiftUI 视图热更新为什么需要 dynamic replacement 和可序列化的视图描述树。Jack 也将这套思路包装成了 Swift SDK:patch-swift⁠。

需要注意的是,这类方案触及 App Store 审核规则中关于下载和执行代码的边界,实际使用时仍需要谨慎评估场景和合规风险。


理解 SwiftUI 的底层核心:属性图 (SwiftUI Is One Graph)

Mihaela Mihaljević Jakić 在过去一周连续发表了两篇关于 SwiftUI 底层机制的长文,值得放在一起阅读。第一篇 SwiftUI Is One Graph 从实际行为和 Apple 专利出发,解释 SwiftUI 并不是简单的 View Tree diff,而更像是一个 demand-driven attribute graph:View struct 本身只是可丢弃的描述,真正持续存在的是属性图,以及其中的状态、依赖、布局和动画传播。

第二篇 《The SwiftUI Oracle: Measuring a Clean Room Against the Real Thing》则进一步展示了如何验证这种理解。作者实现了一个不依赖 SwiftUI 的 clean-room 引擎 PureView,再把真实 SwiftUI 当作 oracle,通过布局、动画、像素渲染等 differential testing 去验证自己的模型。

Mihaela 的工作流对 AI agent 很有启发。Agent 不需要只靠语言模型去猜 SwiftUI 行为是否正确,而是可以生成或修改实现,然后运行测试,让真实 SwiftUI 给出可比较的结果。这种类似“单元测试”的反馈闭环,能把对黑盒框架的理解变成可以持续验证和迭代的工程信号。


在 SwiftUI 中实现可拦截回调的菜单与选择器 (SwiftUI: Intercept-able Picker / Menu / Context Menu)

很多场景下,开发者都希望能在 MenuPickercontextMenu 等组件弹出前执行一些同步操作,比如统计打开次数、更新状态,或者临时决定是否允许展示。但 SwiftUI 并没有提供对应的回调。Itsuki⁠ 在这篇文章中分享了自己的实现思路:通过桥接一个承载 SwiftUI 内容的原生 View,在对应手势触发时先执行 menuWillOpen,再决定是否使用 NSMenu.popUpContextMenu 等 AppKit API 主动展示菜单。

本文再次体现了 SwiftUI 的一个现实问题:很多看似简单的交互控制,一旦超出系统 modifier 暴露的能力,仍然需要理解底层 AppKit / UIKit 才能真正解决。


解析 UIPortalView:从视图实时投影到流体玻璃特效 (_UIPortalView: From Live Mirroring to Liquid Glass-Style Effects)

Artem Mirzabekian⁠ 分享了 UIKit 中一个有趣的私有组件 _UIPortalView。它由 CAPortalLayer 支持,可以把某个 sourceView 的渲染结果实时投射到屏幕上的另一个位置,而不需要复制一份 View 层级,也不需要反复生成 snapshot。相比静态快照,Portal 更像是合成层上的“实时窗口”:源视图仍然是唯一状态来源,而文本、动画、布局或子视图变化都可以同步反映到另一处显示。

文章还把 _UIPortalView 和 Liquid Glass 效果联系起来:通过 matchesPosition、裁剪、偏移和 3D transform,可以实现实时镜像、反射、镜头、共享背景和边缘扭曲等效果。


掌控 SwiftUI 工具栏新 API (Taking control of toolbar items in SwiftUI)

WWDC 26 带来的新 SwiftUI Toolbar API,让系统自适应和开发者显式控制之间取得了更好的平衡。Majid Jabrayilov 在这篇文章中介绍了几项新的控制能力:通过 visibilityPriority 指定 toolbar item 的显示优先级,用 ToolbarOverflowMenu 明确创建折叠菜单,借助 .topBarPinnedTrailing 将重要操作固定在顶部栏尾部,以及使用 toolbarMinimizeBehavior 控制导航栏、标签栏、底部栏等在滚动时的最小化行为。

同一组 toolbar items 在 iOS、iPadOS 和 macOS 上可能会有不同的展示方式。新 API 的价值在于,它们没有破坏 SwiftUI Toolbar 原本的跨平台自适应能力,却让开发者可以更明确地表达哪些操作应该优先显示、哪些操作可以主动放进 overflow,以及工具栏应该如何响应滚动。

工具

iOS-Simulator-Camera-Extend:给 iOS Simulator 补上“真实可用的相机”

iOS Simulator 一直没有真正的相机能力,涉及扫码、OCR、人脸、视频通话、AVCaptureSession 的功能,往往只能上真机或写模拟逻辑。由 Shuyu Guo⁠ 开发的 iOS-Simulator-Camera-Extend 复刻了 SimCam 的核心思路,通过 macOS 端帧源、Simulator 内 DYLD_INSERT_LIBRARIES hook 与 AVFoundation swizzle,让被测 App 无需改代码、无需换 bundle id,就能在模拟器里拿到 Mac 摄像头、桌面、图片、视频和二维码画面。

更有意思的是,它还提供了另一条 CMIO System Extension 链路,让 QuickTime、FaceTime、Zoom、OBS 等 macOS 应用也能看到一台 SimCam Virtual Camera。也就是说,同一份帧源既可以喂给 iOS Simulator 里的 App,也可以作为 macOS 虚拟摄像头使用,对相机相关功能的调试、演示和自动化测试都很实用。

往期内容

💝 支持与反馈

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

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

🚀 拓展 Swift 视野


SPI 加入 Apple,Swift 迈向自举 -- 肘子的 Swift 周报 #142》 是转载文章,点击查看原文


相关推荐


@开发者,提前解锁 FORCE 原动力大会五大看点,限时赢取门票福利
火山引擎Agent社区2026/6/21

过去一年,AI 关注点不断变化,从大模型能力,进一步包括 Agent 能力。能力重点从“生成内容”转向“执行任务”,应用形态也从单点交互,走向多 Agent 协同和系统级运行。 对开发者来说,问题也变了:不只是模型选型,Agent 怎么设计、怎么跑稳、怎么进入真实业务系统,同样成为必须面对的课题。 围绕这些关键问题,我们梳理出 FORCE 原动力大会值得开发者关注的五大亮点。 Future|论坛前沿议题 获得 Agent 时代的技术坐标 Agent 的下一阶段竞争,不只是模型能力,更是系统能


初始化微信小程序
Oneslide2026/6/13

安装miniprogram-cli F:\business-system\weixin-app-order>npm install -g @wechat-miniprogram/miniprogram-cli npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tes


我做了一面互联网摸鱼墙:从无限 Canvas 到本地生产环境
戈德斯文2026/6/6

最近,我做了一个叫「摸鱼表格」的小项目。 它看起来像表格,却没有表头、公式、筛选和工作任务。这里有的,只是一面可以无限拖动、缩放和探索的公共格子墙。 任何人都能选一个空格,写下一句话、一个突然冒出的想法,或者把它当成临时树洞。 项目已经可以直接体验: moyu-table.tangyuan.art 这篇文章不只展示成品。我想完整复盘一次:一个看似简单的互动想法,如何逐步变成拥有数据库、登录、部署、备份和公网入口的产品。 一、它像表格,但这里没有标准答案 传统表格围绕效率组织信息:表头定义含义


Gateway 鉴权场景:网关统一鉴权 + 业务应用决定放行规则
超梦dasgg2026/5/30

目录 一、核心设计原则(一句话总结) 二、具体实现方案(最主流、最推荐) 1. 整体流程 2. 具体技术实现(Spring Cloud Gateway 为例) (1)业务服务:定义注解 + 扫描接口路由 (2)业务服务:启动时自动上报路由权限规则 (3)Gateway:拉取规则 + 全局过滤器统一鉴权 三、更轻量的简化方案(中小型项目常用) 四、为什么要这么设计?(面试加分回答) 五、面试标准回答(你可以直接背) 总结 这是微服务架构中最标准、最常用的鉴权方案:G


保姆级教程:零成本在本地跑AI大模型_Ollama
凤年徐2026/5/8

保姆级教程:零成本在本地跑 AI 大模型——Ollama 从安装到实战 手把手教你,用自己的电脑跑起来满血版 Qwen/DeepSeek/Llama,不需要 API Key,不需要云服务器 预计完成时间: 2-3 小时 所需技能: 会用命令行(3条命令够了) 适合人群: 想玩 AI 大模型但不想花钱、担心隐私泄露、喜欢折腾的同学 前言:为什么要在本地跑大模型? 用过 ChatGPT、DeepSeek 的同学应该知道,每次调用都是要花钱的——DeepSeek-V3 每次 A


我让 AI 当了回老师,把 Claude Code 从头到尾盘了一遍 🔥
LinDaiDai_霖呆呆2026/4/29

前言 你盼世界,我盼望你无bug。Hello 大家好,我是霖呆呆! 最近尝试在用 Claude Code 写项目,建仓库、修 bug、代码审查什么的都用它。但说实话,用是用了,总感觉自己就是个"面向弹窗编程"选手 —— 它弹窗我就点确认,它问我就说好,至于它到底是怎么运作的?权限模式有几种?Hooks 能干嘛?emmm...😅 直到我发现三元写了个 skill(名为 sigma) ,安装完后在 claudeCode 里使用 /sigma 你想学习的知识 命令,它就能变身 AI 1v1 家教,


拒绝低效!这款神器,让你的终端效率起飞 | 深度解析 fzf 终极指南
GetcharZp2026/4/20

还在手动敲 cd 和 ls?还在繁琐的 history 中翻找命令?是时候换个方式工作了。一篇文章带你彻底掌握命令行模糊找回神器 fzf,从安装到进阶玩法,助你效率翻倍! 身为开发者,我们每天大部分的时间都花在了终端(Terminal)里。不论是切换目录、搜索文件,还是翻阅历史命令,这些细碎的操作如果效率低下,积少成多便会吞噬掉大量专注力。 你是否也曾经历过: 想找一个深层目录下的文件,却记不清完整路径,只能不断 ls 确认? 按 Ctrl+R 搜索历史命令,结果搜出来的不是自己想要的?


OpenClaw实操指南13|用AI接管飞书多维表格:自动建表、写数据、做分析,一条指令搞定
Rubin智造社2026/4/12

飞书多维表格是很多团队的数据中枢——项目管理、内容选题、客户跟进、数据分析,全在里面。 但维护它是个体力活:手动建字段、逐条录数据、定期整理……重复劳动大量消耗精力。 这篇教程教你用OpenClaw的lark全套技能,把飞书多维表格的常见操作全部交给AI。 一条指令建表,一条指令批量写数据,一条指令做分析汇总。你只需要告诉AI你要什么,剩下的它来做。 核心概要 这篇解决什么问题? 安装并配置lark全套技能,实现飞书多维表格的AI自动化操作:建表、字段管理、数据读写、视图


别再把 LangChain 当成 API 胶水:Runnable 才是把 AI 流程工程化的关键接口
swipe2026/4/4

很多人第一次接触 LangChain,会把它理解成一组“帮你调模型”的工具类:PromptTemplate 负责拼 prompt,ChatOpenAI 负责调模型,OutputParser 负责解析结果。这样理解没错,但只对了一半。 真正到了工程里,问题很快就不是“怎么调一次模型”,而是“怎么把一条会持续演化的 AI 流程组织好”。 比如一个看起来简单的企业问答助手,往往很快就会长成这样: 先清洗用户问题 再决定这是闲聊、任务型问题,还是知识问答 不同类型走不同 prompt 有的分支要结构化


【35天从0开始备战蓝桥杯 -- Day6】
小年糕是糕手2026/3/26

🫧个人主页:小年糕是糕手 💫个人专栏:《C++》《Linux》《数据结构》《C语言》 🎨你不能左右天气,但你可以改变心情;你不能改变过去,但你可以决定未来! 目录 一、进制转换 1.1、二进制转十进制 1.2、十进制转二进制 1.3、二进制转八进制 1.4、二进制转十六进制 1.5、原码、反码、补码 练习 1°10 进制转 x 进制 2°x 进制转 10 进制 3°进制转换1 4°进制转换2 二、位运算操作符 2.1、左移操作符 2.2、右移操

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读