Issue #126

Macbook Neo:苹果重回校园的起点

Cover for Weekly Issue 126

上周,苹果推出了若干新款硬件产品。与以往的发布会不同,这次发布显得异常低调。起初我只对其中新发布的显示器感兴趣,但在看到不少数码媒体对 Macbook Neo 配置的吐槽后,也不由得多留意了这款产品。相较于其“减配”的表象,我更从其精准的定价中看到了苹果重返教育市场的决心。

十几年前,苹果还曾是教育硬件市场的重要参与者。那些在校园中使用苹果设备成长起来的学生,也有相当一部分在进入社会后顺理成章地成为苹果软硬件的长期消费者。但随着谷歌持续加大在 Chromebook 上的投入,而苹果又缺乏更具价格竞争力的产品,这一以 K12 为核心的市场逐渐被对手占据(Chromebook 曾一度拿下美国基础教育市场近 60% 的份额)。这不仅让苹果损失了一部分收入,更重要的是削弱了其在青少年群体中、围绕台式机与笔记本这种计算形态所建立的品牌亲和力。相比平板设备,笔记本在教学体验、适用场景、耐用性以及 IT 集中管理等方面依然具有明显优势。

在服务优先的今天,硬件往往与生态深度绑定。Chromebook 早早培养出一大批习惯使用 Google Docs 的年轻用户。随着年龄增长与数据的积累,即便他们日后具备购买苹果设备的能力,也很难再与苹果的服务生态形成深度绑定,更难形成真正的品牌信仰。

Neo 精准的定价改变了这一局面。$599 的起售价、$499 的教育优惠,让更多孩子有机会在学校就开始使用苹果设备、拥有 Apple ID,从而顺着苹果“预设”的轨迹,逐步购买更多产品与服务。至于被广泛批评的”减配”——A18 Pro 芯片对 K12 日常使用场景而言完全足够,它缺的不是性能,而是定位本就如此。苹果用移动端芯片换来了激进的定价空间,这是一笔算得很清楚的账。

采用订阅制的 Apple Creator Studio,同样展现了苹果希望让更多人与其生态建立长期联系的野心。对于学校而言,廉价硬件+强大的创作软件套件,构成了闭环。Macbook Neo 的硬件性能或许不算强劲,但足以在每台设备约 4–5 年的生命周期中提供稳定、可用的体验,让使用者逐步融入苹果的服务体系。从这个角度来看,MacBook Neo 更像是苹果抛向 Z 世代与 Alpha 世代的一枚“生态锚点”。

太多消费者和数码博主过于聚焦于苹果产品是否炫酷、是否有创新,却忘记了苹果的来时路——教育硬件市场深植于它的基因之中,今天的成功源于数十年前的积累,而现在它需要补上最近十几年的空缺。对于本周报的读者来说,Neo 大概率不是你的菜。但这并不妨碍它成为一款极具针对性、也颇具野心的产品——不是用来赚快钱的,而是苹果为未来二十年的生态版图所做的一次长期押注。

本期赞助

Notepad.exe — Swift 新特性的第一个实验场

Swift 6 出了新语法?Xcode 太重,Playground 又太慢。Notepad.exe 让你在 30 秒内写代码、跑结果,专注验证想法本身。支持多版本工具链切换,集成模拟器,随开随用。

🚀 立即使用 →

原创

跨域传递 NSManagedObjectContext 为什么在 Swift 6.2 中不再报错?真正的变化不在编译器

当同一段与并发有关的代码在旧版 Xcode 中无法通过,却在新版 Xcode 26(Swift 6.2)中顺利编译时,你第一时间会想到什么?很多人最初的判断可能是 Swift 编译器的并发分析(如 Region-Based Isolation)又进化了,但现实并没有这么简单。本文记录了我最近遇到的一次非常有意思的排查过程:从测试失败出发,通过构建最小复现用例,一步步追溯到 Core Data 的 SDK interface,最终发现,问题的关键并不完全在 Swift 编译器本身,而是框架的导入语义发生了变化——在新的 SDK 中,NSManagedObjectContext 获得了 NS_SWIFT_SENDABLE 等宏标注,使其在 Swift 中拥有了 Sendable 语义。

尽管 SwiftData 是未来苹果生态最重要的持久化框架,但作为其基础的 Core Data 并没有被苹果冷落。在过去几年中,苹果一直在默默改善其在 Swift 6 中的兼容性和并发体验,这是一个很好的现象。

近期推荐

Swift 语言 2 月新动态 (What’s new in Swift: February 2026 Edition)

Karen ChuDave Lester 在官方博客上整理了 2026 年 2 月 Swift 社区的生态动态。内容不仅涵盖了 Swift 在 FOSDEM(全球最大开源会议)上的活跃表现,还推介了多项重磅的开源进展与 Swift Evolution 提案。其中的 SE-0506 尤为让我惊喜。该提案为 withObservationTracking 增加了 Options 参数,开发者现在可以精确控制是观察变化前(willSet)、变化后(didSet)还是对象的生命周期(如 deinit)。并且通过 withContinuousObservationTracking 无需再手动递归注册,即可实现稳定、自动循环的连续事件追踪。

SE-0506 提案的通过意义重大。它不仅完美补齐了状态追踪的时机控制和连续性能力,更标志着 Swift 原生的 Observation 已经彻底成熟——它不再仅仅是 SwiftUI 的“专属附庸”,而是真正蜕变为了 Swift 语言中足以应对各种工业级、高性能状态流调度的核心基础设施。


写在 2026 年的 macOS 输入法开发规范

vChewing 唯音输入法 的作者 ShikiSuen 基于多年深耕 macOS 输入法的开发经验,全面梳理了 InputMethodKit (IMK) 的历史包袱,以及它在 Swift 6 严格并发检查下暴露出的种种痛点。文章深入探讨了 NSConnection 的命名规范、启用沙盒的必要性、MainActor 隔离冲突,以及高频中英切换(CapsLock)导致的 ARC 拥堵、macOS 26 Liquid Glass 机制下 NSWindow 运存不释放等棘手问题。面对苹果“上古框架”与现代 Swift 并发模型的碰撞,作者没有停留在抱怨上,而是提出了一套像“风险控制模型”一样的工程规范——将控制器退化为纯转发层、把业务逻辑剥离到弱引用 Session、使用运存自查自尽、彻底避开 IMKCandidates 等。

可贵的是,ShikiSuen 基于上述思路开发并开源了 IMKSwift 库。它为 Swift 6+ 提供了 @MainActor 完整隔离的 IMKInputSessionController 基类,完美覆盖了原生 IMKInputController 的并发地雷区。如果你需要开发 macOS 桌面端应用或输入法,这个库能让你无需手动 Hack,就能写出类型安全、无 data-race 警告的现代代码,非常值得学习与使用。


SwiftUI 的洋葱式架构:Swift Effects 实践 (SwiftUI, Swift Effects: A Beautiful Onion Architecture)

在 SwiftUI 中处理数据加载状态几乎是每个应用都会面对的问题:loadingloadedfailed 三种状态往往伴随着网络请求、缓存、日志记录等副作用逻辑,很容易让视图代码逐渐变得臃肿。Salgara 在本文中提出了一种类似 Onion Architecture 的思路:通过 ViewState + Effect Handlers 将 Fetch、缓存、日志等副作用拆分为多个可组合层级,并利用 AsyncSequence 与可注入的 Effect Handler 驱动状态变化,使 UI 仅根据状态进行渲染。这样一来,视图保持纯粹,而数据获取与副作用则沿着一条清晰的“Effect 管道”逐层流动。同时,这种结构也天然具备良好的可测试性——测试代码可以直接拦截并模拟数据源返回值,从而验证完整的状态转换流程。

Salgara 坦言,这种架构目前仍然是实验性的:原型优先,并尝试将一切视为视图(Everything as a View)。随着越来越多开发者从不同角度思考并尝试构建更符合 SwiftUI 特性的架构,这类探索不仅可能让 SwiftUI 本身受益,也有机会反过来丰富整个声明式编程范式,而不再只是复制其他 UI 框架的既有实践。


Spec-Driven Development:当 AI 写代码之后

随着 Cursor、Claude Code 等 AI 编程智能体(Agent)的普及,开发者们正面临一个新的痛点:当 AI 能在几分钟内跨越几十个文件生成上千行代码时,人类该如何有效审查?又该如何应对 AI 在长流程中逐渐出现的“上下文遗忘(Context Decay)”与幻觉问题?为此,一种新的开发范式正在逐渐成形:Spec-Driven Development(SDD)。在这一模式下,开发者的主要任务不再是直接编写代码,而是定义清晰的规格(Spec),再由 AI 根据这些规格生成实现。

Snow 通过四篇文章系统梳理了这一思路:从 “Vibe Coding” 的局限出发,介绍以规格为核心的开发流程,并进一步探讨规格在未来软件工程中的角色——代码或许不再是项目的中心,而只是规格的衍生物。

在 AI 逐渐承担实现细节的时代,软件工程的重心或许正在从“写代码”转向“表达意图”。SDD 尝试在人类的模糊意图与 AI 的无差别生成之间,建立一层强有力的约束。


为 SwiftUI Preview 构建一个 Mini Linker (Building a Mini Linker for SwiftUI Previews)

在 Xcode 26.3 的 mcpbridge 提供的众多工具中,RenderPreview 可以直接返回 SwiftUI Preview 的截图,方便 AI 进行分析。对于暂时无法使用 Xcode 26.3 mcpbridge 的开发者,Hesham Salman 在本文中介绍的思路以及配套工具,同样可以实现类似的能力。其技术亮点在于利用 SwiftSyntax 构建声明依赖图,再通过 BFS 找出当前 Preview 真正需要的最小源文件集合,从而避免编译整个 App Target 带来的构建等待。

本文的精华在于思路:利用 SwiftSyntax + BFS 快速定位 Preview 依赖的代码片段。过去 SwiftSyntax 的使用门槛较高,但在 AI 辅助开发逐渐普及的今天,它正逐渐成为理解代码结构的重要基础设施。即便你不像 Hesham Salman 那样熟练掌握该工具,了解其基本能力后,也可以借助 AI 将类似思路落地——而这类工具在过去往往只属于少数熟悉编译器工具链的开发者。


Swift 的规模化实践:TelemetryDeck 的分析服务 (Swift at scale: building the TelemetryDeck analytics service)

很多人讨论 Swift on Server 时,关注点往往停留在“能不能用”,而 TelemetryDeck 给出的则是一个更实际的答案:不仅能用,而且已经支撑起一项面向开发者、每月处理超过 1600 万用户数据的 analytics 服务。Daniel Jilg 在这篇文章中回顾了团队为何选择 Swift + Vapor 构建后端,并分享了不少来自生产环境的经验:例如如何借助 Codable 简化 API 编解码与校验、为什么应让 DTO 更贴近 controller、以及为何缓存 TTL、API 版本管理和错误监控这些“老生常谈”,在规模化的生产环境中往往才是真正的护城河。


是时候告别 SwiftGen 了吗? (Get Rid of Your SwiftGen Dependency)

很长一段时间,开发者需要依赖类似 SwiftGen 这样的工具来解决 Apple 资源系统中的一个老问题:资源访问是字符串类型(stringly-typed)。无论是 localization key、图片名称还是颜色资产,一旦拼写错误,往往只能在运行时才会暴露问题。Asser Osama 指出,随着 String Catalog(.xcstrings)与 Asset Catalog Symbols 的引入与逐步完善,Xcode 已经能够在编译阶段自动生成资源符号,这种原生能力在不少现代项目中或许已经足以替代 SwiftGen。

需要说明的是,“移除依赖”的前提是项目完全运行在标准的 Xcode 生态中。Xcode 的符号生成属于构建系统内部机制,而不是 Swift 编译器或 Swift Package Manager 的能力——这意味着对于使用 Bazel、Buck 等非标准构建系统的团队来说,SwiftGen 仍然可能是更可移植、更可控的选择。

工具

SwiftUI Agent Skill

Paul Hudson 编写的 SwiftUI Agent Skill,旨在帮助开发者编写更智能、更简洁、更现代的 SwiftUI 代码。该项目发布仅两天便获得了 1k+ Star。

在过去几周中,本周报已经推荐了不少知名开发者编写的各类 Skill。尽管这些 Skill 都凝聚了作者的经验,但我仍不建议开发者直接“拿来即用”。至少应在采用前完整阅读一遍:Skill 更像是作者对自己数十甚至上百篇文章经验的提炼,而不是可以直接替代思考的“最佳实践”。开发者在理解其背后的设计思路后,再根据自己的开发习惯与项目需求进行取舍,这样才能更大地发挥它们的价值。

活动

LET’S VISION 2026,开票啦!

作为在中国举办、面向全球的 Apple 生态下的大会,今年的 LET’S VISION 将会有约 20 场演讲、超过 80 个展位,欢迎前往官网和票务平台了解更多信息。

相关周报

订阅 Fatbobman 周报

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

立即订阅