普通视图

发现新文章,点击刷新页面。
今天 — 2025年4月8日首页

切勿将辅助驾驶宣传成智能驾驶 | 肘子的 Swift 周报 #078

作者 东坡肘子
2025年4月8日 08:02

issue78.webp

weekly.fatbobman.com 订阅本周报的电子邮件版本。访问我的博客 肘子的 Swift 记事本 查看更多的文章。加入 Discord 社区,与 2000+ 中文开发者深入交流 Swift、SwiftUI 开发体验。

切勿将辅助驾驶宣传成智能驾驶

不久前,某个造成三人死亡的交通事故因为涉及某新锐电动汽车品牌再度引发了人们对“智能驾驶”功能的质疑。在目前披露的有限资料中,至少可以确认的是,“智能驾驶”系统未能在相当长的一段行驶距离中判断出当前的路段正在施工(沿途有施工警示标志),只在撞击前2-3秒前给予了警示。这意味着,在系统报警后,驾驶者只有极短的反应时间。

从当前的法规角度来说,无论是否启用“智能驾驶”功能,对于事故所造成的后果在没有其他汽车机械结构问题的情况下,仍主要由驾驶人本人来承担。但随着越来越多事故与“智能驾驶”相关联,我们不得不质疑:这难道真的和这些汽车厂商对于“智能驾驶”的过分夸大宣传无关吗?

最近一两年出现了一个值得关注的现象:许多非科技行业的普通消费者了解 AI 概念和相关专业术语的渠道,很大程度上竟然来自于提供“智能驾驶”功能的汽车厂商的发布会和销售宣传。从“端到端”到 TOPS,似乎一夜之间,主要作为交通工具的车辆成为了高科技的最佳载体,“智能驾驶”功能成为了消费者购买车辆的重要参考因素。

事实上,无论是从当前的科技发展水平还是各个地区的法律准备来看,即使发展到了 L5 阶段(现阶段大多数车型仍处在 L2 至 L3 之间),所谓的“智能驾驶”仍应被定义为“辅助驾驶”。这不仅关乎系统能力的局限性,更涉及最终责任划分的法律问题。各个车厂很清楚这一点,因此你可以在它们提供的各种说明、手册、宣传资料(角落中,用小字标注)看到它们给出的警示。但在更广泛的宣传渠道上,“辅助驾驶”一词早已被“智能驾驶”所代替。

随着各种对“智驾”的持续宣传,消费者在不知不觉中就丧失了对驾驶安全的责任感,产生了“智驾”更好、更安全的错觉。即使某些“智能系统”确实有着不错的辅助功能,但它们远未达到可以完全替代人类驾驶员判断的程度,尤其是在复杂、非常规的交通环境中。

尤其值得警惕的是,许多厂商在宣传“智能驾驶”能力时,只展示高端配置下的最佳表现,却忽视了中低端车型在算力、摄像头、传感器等方面的减配情况。更严重的是,有些厂商并未针对不同配置对算法进行差异化适配,导致低配车型的“智能系统”极易出现计算失误和决策延迟的问题,这直接加剧了交通事故风险。

实际上,“智能”、“自动”本身就是极易产生误解的模糊概念。当这些模糊的营销词汇已明显误导消费者的驾驶安全认知时,必须尽快出台明确的法律规范,限制相关用语的宣传范围与频率,并对夸大宣传进行严厉处罚。只要法律明确最终责任人仍是驾驶者本人,那么所有驾驶系统无论如何宣传,都应被严格限定在“辅助驾驶”的范畴之内。同时,消费者也应明确认识到,现阶段没有车厂会为所谓“智能系统”的问题承担法律责任。更何况,普通消费者根本不具备就“智能系统”的缺陷进行有效举证的能力。

切勿将辅助驾驶宣传成智能驾驶!

前一期内容全部周报列表

原创

远离 dismiss,拥抱状态驱动

在 SwiftUI 开发中,环境值 dismiss 因其灵活、自适应的特性备受开发者青睐。它能够根据当前视图的上下文智能执行关闭操作,让许多开发者将它作为首选工具。然而,便捷的背后往往隐藏着风险。频繁使用 dismiss 可能在应用程序中埋下隐患,引发测试难题乃至难以追踪的稳定性问题。本文将分析我们为何应谨慎对待 dismiss,并介绍更加健壮可靠的状态管理方案。

近期推荐

Swift 6.1 发布

Swift 6.1 正式发布!Holly Borla 在本文中介绍了多个令人期待的新特性。本次更新在语言层面带来了更广泛的 nonisolated 支持、更智能的 withTaskGroup 类型推导,以及更便捷的 @objc @implementation,进一步强化与 Objective-C 的互操作能力。在语法便利性方面,尾随逗号现已支持用于函数参数、泛型定义、闭包捕获列表等结构,简化了代码生成与维护流程。

SwiftPM 引入 Package Traits,支持根据运行环境(如 Embedded 或 WebAssembly)配置不同的 API 和依赖,进一步增强跨平台能力。同时,SourceKit-LSP 现已默认开启后台索引,显著提升开发期间的响应速度与智能感知表现。

在测试方面,Swift Testing 推出了 Test Scoping Traits,使测试前后的上下文共享更加灵活易控;Swift-DocC 也改进了重载函数链接的歧义处理机制,提升文档的可维护性与可读性。

Swift 6.1 可通过 Xcode 16.3 获取,也可使用 swiftly 工具在 macOS 与 Linux 上独立安装。

Swift 的跨平台编译 (Cross Compiling Swift)

提升跨平台编译能力,是 Swift 向全平台生态迈进的重要一步。Khan Winter 在开发 Discord Bot 和 Bluesky Bot 的过程中,深入探索了将 Swift 应用从 macOS 编译部署至 Gentoo Linux 的两种路径:一是借助 Static Linux SDK 与 Swiftly 工具实现的本地交叉编译,二是使用 Docker 容器完成传统的跨平台构建。文章不仅展示了详细的工具链配置与部署脚本,也指出了当前 toolchain 与 SDK 配置上的不一致和易混淆问题。

Swift 中的现代 URL 构造方式 (Modern URL Construction in Swift)

在 Swift 中构造 URL 时避免处理 Optional 一直是开发者关注的问题。John Sundell 在这篇久违的回归文章中,分享了静态与动态 URL 构造的现代实践:对于静态 URL,可通过扩展 URL.init(staticString:) 简化强制解包流程,结合 Swift 5.9 引入的宏功能,还可实现编译期校验的 #staticURL(...);对于动态 URL,则推荐使用 iOS 16 起提供的 appending(component:)appending(queryItems:) 等 API,替代传统字符串拼接方式,提升代码的安全性与可读性。这些改进让我们能以更简洁、可靠的方式构造 URL,适用于网络请求与文件路径等场景。

在 SwiftUI 中应用 Inspector 组件 (Presenting an Inspector with SwiftUI)

Inspector 是 iOS 17、iPadOS 17 与 macOS 14 中引入的 SwiftUI 组件,常用于展示与选中内容相关的详细信息。它会根据平台与上下文以不同形式呈现,这是其灵活性的体现,也为开发者带来了额外的理解成本。在本文中,Antonella Giugliano 通过多个代码示例,详细演示了 Inspector 在各种使用场景下的表现,并介绍了如何通过 InspectorCommands 实现快捷键控制其显示。

将地图视图保存成图片 (Creating an Image from an MKMapView)

虽然 SwiftUI 提供了 ImageRenderer API 用于将视图转换为图片,但在某些场景下并不能满足需求。Patrick McConnell 在尝试导出 MapView 时就遇到了这个问题。本文分享了他在 macOS 项目中,通过 NSViewRepresentable 嵌入 MKMapView,并借助视图层级探索,找到一种可行方案,最终成功生成包含路径、图层与标注的完整地图图像。文章不仅解释了为何标注无法直接渲染成图像,还提供了对 NSViewMKMapView 的扩展代码,实现了当前地图状态的稳定导出。

支持 MCP 的七个 AI 框架 (The Top 7 MCP-Supported AI Frameworks)

Model Context Protocol(MCP)正逐步成为连接 LLM 与外部工具的行业标准,提供了一种统一、高效的上下文注入方式。在本文中,Amos Gyamfi 系统梳理了七个支持 MCP 的主流 AI 框架,包括 OpenAI Agents SDK、LangChain、Chainlit、Agno、Upsonic、Mastra 等,并通过详实的示例代码演示了如何将 MCP 工具集成进代理式(agentic)工作流,显著提升 AI 应用的扩展性与可维护性。尽管示例代码基于 Python 与 TypeScript,仍为苹果生态开发者提供了参考思路。

SwiftUI 状态管理 (SwiftUI Craftsmanship: State Management)

在 SwiftUI 中,一切皆由状态驱动。本文中,Danny Bolella 以“最小状态”作为指导原则,探讨了如何在复杂界面中实现状态管理的简化与分层:通过识别状态间的依赖关系,将状态分离到对应的子视图中,不仅提升了代码可读性,也让 UI 保持响应性与可维护性。

AdventureX 2025

AdventureX-2025

AdventureX 2025 将于 2025 年 7 月 23 日至 27 日在中国杭州举行。本届活动将创造中国黑客松规模的新纪录,提供 800 个参赛名额,并为参赛者提供免费食宿与出行补助。

往期内容

THANK YOU

如果你觉得这份周报或者我的文章对你有所帮助,欢迎 点赞 并将其 转发 给更多的朋友。

weekly.fatbobman.com 订阅本周报的电子邮件版本。访问我的博客 肘子的 Swift 记事本 查看更多的文章。加入 Discord 社区,与 2000+ 中文开发者深入交流 Swift、SwiftUI 开发体验。

昨天以前首页

OpenAI 向美政府状告 DeepSeek:他不讲武德!| 肘子的 Swift 周报 #075

作者 东坡肘子
2025年3月18日 07:58

issue75.jpg

weekly.fatbobman.com 订阅本周报的电子邮件版本。访问我的博客 肘子的 Swift 记事本 查看更多的文章。加入 Discord 社区,与 2000+ 中文开发者深入交流 Swift、SwiftUI 开发体验。

OpenAI 向美政府状告 DeepSeek:他不讲武德!

几天前,OpenAI 向美国政府提交了一封长达十五页的进言,将 DeepSeek 带来的竞争威胁上升至国家安全层面,并试图将其框定为意识形态竞争。这是 OpenAI 对美国白宫科技政策办公室(Office of Science and Technology, OSTP)就 人工智能行动计划(AI Action Plan)公开征求意见的反馈。坦率而言,当看到这则新闻时,我不禁哑然失笑——难以想象行业巨头 OpenAI 会如此沉不住气,展现出这般脆弱的一面。

这两年来,OpenAI 等企业一直向全球灌输一种观念:打造领先的大模型必须依靠海量资金与超级算力,这是一个门槛极高的领域,普通玩家根本无缘参与。凭借这一论调和先发优势,OpenAI 创造了惊人的估值,并源源不断地吸引资本涌入。然而,DeepSeek 的出世打破了这一既定认知,促使越来越多的国家、企业乃至个人开始重新审视进入大模型领域的可能性。

OpenAI 显然察觉到了投资者对其“高门槛论”的迟疑与动摇。为了稳固自身地位,他们选择采取更为强硬的手段,急于重申资金的决定性作用,并巧妙地为自身对资本的渴求披上了一层“意识形态对抗”的外衣。

AI 行业,尤其是大模型领域今天取得的成就,源自众多科研人员和企业的共同努力与无私分享。作为一家受益于开源社区,并积极公开自身研究成果和技术细节的企业,DeepSeek 推动了社区的发展,也为降低 AI 训练和推理成本作出了贡献。这些开放成果本应惠及整个社会,当然也包括那些已处领先地位的 AI 公司。但正如我在第 68 期周报 中所指出的:“那些习惯于高投入、大规模资源配置的头部 AI 企业,在短期内转变思维模式无疑是困难的。即使 DeepSeek 的方法能够提供一些启发,但如果没有彻底的理念变革,这些企业在降低训练成本上将难以取得持续的显著进展。”

显而易见,OpenAI 正陷入这种思维转型的困境。当意识到自身难以快速改善成本结构时,它选择了更为激进的竞争手段,即向美国政府寻求外部干预,以此减缓竞争对手发展的步伐。这种幼稚的做法像极了小孩子在向家长告状,或许能在短期内缓解资本市场的压力,但从长远来看,并不能解决企业自身的发展瓶颈。

AI 的崛起不仅是人类科技史上的一次重大变革,也是一场充满商业机遇的挑战。作为拥有广阔市场前景的朝阳产业,激烈的竞争在所难免,各国与企业纷纷加紧布局抢占先机。在大模型技术逐渐接近性能天花板,各类模型性能日益趋同的当下,能够提供特色应用场景和具备更高性价比的产品,才是真正决定市场胜负的关键。OpenAI 此番或许并未采用合适的竞争策略——如果不能坦诚面对并有效解决自身存在的结构性问题,那么未来真正能取而代之的,很可能并非它所指控的 DeepSeek,而是在性价比与特色场景方面更具优势的那些曾被其甩在身后的国内竞争者。

值得一提的是,与 OpenAI 相比,Anthropic 向白宫提交的反馈甚至更为极端。DeepSeek 不过是众多挑战现有格局的新锐之一,它只是让更多人看到了进入这个所谓“高门槛”行业的可能性。相信很快我们会看到来自全球各地更多类似 DeepSeek 式的成果展现。

我从不否认知识产权的重要性,也不否认国家级 AI 竞争可能带来的安全风险。然而,对于那些自身尚未在知识产权问题上建立足够可信背书的年轻企业来说,积极寻求政策保护,反而可能削弱自身的创新动力,限制长期发展。

前一期内容全部周报列表

原创

SwiftData 使用前必须了解的关键问题

在刚刚结束的 Let’s Vision 2025 大会上,我收到了许多关于 SwiftData 的提问:“SwiftData 是否已经足够成熟,可以用于实际项目?”、“作为初学者,如何高效地使用 SwiftData?”。这些问题反映了开发者对苹果最新数据持久化框架的浓厚兴趣,但也透露出技术选型时的犹豫。本文旨在为对 SwiftData 感兴趣的开发者提供一份指南,帮助你了解 SwiftData 的优势与局限,并根据项目需求做出明智的技术选择。

近期推荐

Async 函数的幕后机制 (Behind the Scenes of Async Functions)

Swift Concurrency 带来了更安全、更高效的异步编程模型,但你真的理解它的内部运作吗?在这篇文章中,Vitaly Batrakov 深入解析了 async/await、Tasks、Jobs、Executors、Actors 以及 Cooperative Thread Pool 的核心概念,帮助开发者建立更清晰的 mental model。本文适合已有并发基础的开发者,能帮助你更全面地掌握 Swift Concurrency 的工作原理。

当 Swift 编译器在标准库中删除代码时 (When the Swift Compiler Deleted Code in Stdlib)

Swift 编译器的优化机制本意是提升性能,但有时候却可能“优化过头”,引发意想不到的 Bug。WeZZard 在这篇文章中分享了一起 use-after-free 崩溃案例,该问题发生在 -Osize 优化级别下,根本原因是 Swift 编译器误删了关键代码,导致程序访问已释放的内存。幸运的是,WeZZard 经过深入分析后,在 Swift 社区提交的 Pull Request 已成功合并,修复了这个问题。这篇文章或许读起来有些硬核,但如果你对 Swift 编译器优化、SIL 以及 LLVM 感兴趣,它绝对值得一读!

Swift Testing 中的 Completion Handler 处理 (Swift Testing Completion Handlers)

XCTest 中,我们通常使用 XCTestExpectation 来等待异步操作完成,但 Swift Testing 并没有提供直接等效的 expectation 机制。官方推荐的做法是使用 continuations 来将基于 completion handler 的异步代码转换为 async/await。如果你是从零编写测试,这种方式非常自然,但当你需要迁移大量 XCTest 代码时,工作量可能会大幅增加。Keith Harrison 在本文中分享了一种高效的迁移策略,利用 withCheckedContinuation 简化 completion handler 代码的转换,让你在迁移过程中减少不必要的重复工作,大幅提升效率。

🪜 SwiftUI:交互式图表 (SwiftUI: Interactive Charts)

与许多常见的图表框架不同,Swift Charts 采用了声明式 API,这让某些开发者在实现交互时感到不太直观。在本文中,Itsuki 深入解析了 Swift Charts 的内置交互方式,并探讨了如何使用 chartGesture(_:) 来自定义手势,从而实现更灵活的用户交互体验。

🪜 SwiftUI 的底层原理 (Under the Hood: SwiftUI)

SwiftUI 让用户界面开发变得更加直观,但由于其黑盒特性,开发者往往难以洞悉其底层运作机制。在这篇文章中,Mihai Popa 通过一种访谈式的叙述方式,清晰而简洁地阐释了 SwiftUI 的诸多核心原理,包括声明式渲染架构、状态驱动的界面更新机制、视图差异化比较(diffing)算法,以及与 UIKit 的桥接技术等关键内容。

互联网的探索感正在消失 (Browse No More)

曾几何时,我们在互联网上的浏览充满了探索的乐趣,随意点击、偶然发现,让每次搜索都可能成为一场意想不到的冒险。然而,如今 AI 答案引擎(如 ChatGPT、Perplexity、Grok、Gemini 等)正在重塑我们的信息获取方式——它们提供即时、精准的回答,却在无形中削弱了我们的自主性,让互联网的多样性逐渐消失。我们不再主动探索,而是被 AI 精选的答案所引导,错过了许多原本可能发现的独立创作者、小众社区和新鲜视角。在这篇文章中,Paul Stamatiou 深入探讨了这种变化对互联网生态的影响,并提出 AI 未来可能的个性化发展方向,以帮助我们找回探索的自由。

往期内容

THANK YOU

如果你觉得这份周报或者我的文章对你有所帮助,欢迎 点赞 并将其 转发 给更多的朋友。

weekly.fatbobman.com 订阅本周报的电子邮件版本。访问我的博客 肘子的 Swift 记事本 查看更多的文章。加入 Discord 社区,与 2000+ 中文开发者深入交流 Swift、SwiftUI 开发体验。

期待与失望的循环:苹果的 AI 困境与韧性 | 肘子的 Swift 周报 #074

作者 东坡肘子
2025年3月11日 08:02

issue74.webp

weekly.fatbobman.com 订阅本周报的电子邮件版本。访问我的博客 肘子的 Swift 记事本 查看更多的文章。加入 Discord 社区,与 2000+ 中文开发者深入交流 Swift、SwiftUI 开发体验。

期待与失望的循环:苹果的 AI 困境与韧性

几天前苹果宣布将 “More Personalized Siri” 功能推迟到明年,再结合始终不见踪影的 Swift Assist,很显然,苹果没有达成其在 WWDC 2024 上构建的 AI 愿景。至少在大模型的应用场景上,苹果没有展现出一贯的快速跟随能力。

但就此断定苹果在本次 AI 浪潮中失去了反击的能力还为时尚早。无论是有意还是无意,苹果在转向 M 系列芯片时采用的统一内存机制让其 Mac 系列设备具备了相当不错的本地模型推理能力。而且,随着最新支持 512GB 内存的 Mac Studio 推出,苹果又以另外的身份在本次 AI 变革中取得了一席之地。

虽然英伟达仍是模型训练和推理的首选,但 Mac 设备凭借高集成度与高能效比,已吸引不少用户。随着更多模型优化适配 MLX,其在大模型推理中的表现有望进一步提升。

当然,Mac 设备取得的成绩仍无法掩盖苹果在大模型方向上反应不及时的窘境,但至少表明了一些多管齐下的大企业所具备的天然优势:东边不亮西方亮。这种策略多元性恰恰是科技巨头在面对快速变化的技术浪潮时的一张王牌。

大模型真的代表未来?没能紧跟这股浪潮,企业就一定会被淘汰吗?尽管我并不这样认为,但显然在当下的舆论环境中,消费者、投资者需要企业在大模型开发、应用等领域中交出一份有感的答卷。也就是即便企业有既定的 AI 发展路线,也可能因市场和舆论环境的变化而被迫调整。

于是,我们就在最近的一年以及未来的几年中会看到越来越多的 PPT 式的愿景发布会。不给出期待大家会失望,给出了期待但没有达成大家会继续失望。这种"期待-失望"的循环似乎已成为科技行业的新常态,特别是在 AI 这样充满不确定性的领域。

在 AI 领域,企业既要保持定力,又要让市场满意,这种平衡正变得越来越难,“期待-失望”的循环也许已成为行业的常态。对于开发者和企业来说,或许真正的智慧在于既能拥抱创新浪潮,又不盲目追随市场喧嚣,在踏实做事与满足期待之间找到平衡点。毕竟,技术的真正价值不在于其炫目的承诺,而在于它能为用户带来的实际改变。

前一期内容全部周报列表

原创

让 @State 实现懒加载

Observation 框架为 Swift 带来了原生的属性级观察能力,有效避免了 SwiftUI 中因无关属性变化而引发的多余视图更新,从而提升了应用性能。但由于 @State 并未提供类似 @StateObject 的懒加载构造方式,在某些场景下会因实例过早构建而引起性能损失甚至逻辑问题。本文将探讨如何为 Observable 实例定制一个支持懒加载的 @State 解决方案。

近期推荐

在 Swift 中动态构造泛型类型的方法探索 (Dynamically Constructing Generic Types in Swift)

泛型类型通常需要在编译期确定具体类型,但在部分特殊场景下,编译期无法提供足够的类型信息。Kyle Ye 在开发 OpenSwiftUI 时,发现 SwiftUI 中的 _ConditionalContent<TrueContent, FalseContent> 就属于这种情况。本文介绍了一种通过定义自定义的 MetadataProtocolDescriptor 类型来访问和解析运行时类型信息,以动态构建泛型类型的实现方案。

巧用视图复用,提升 SwiftUI 滚动列表性能 (Designing a Custom Lazy List in SwiftUI with Better Performance)

SwiftUI 提供了 ListLazyVStack 等惰性容器,但在处理大规模数据时,这些组件的性能仍然存在局限性。此外,SwiftUI 目前的 Layout 协议尚未支持惰性加载,使得开发者难以通过原生方式构建更高效的自定义滚动容器。在本文中,Matthaus Woolard 采用行复用机制,通过动态调整视图位置而非创建新视图,实现了一种适用于固定高度、重复子视图的高性能滚动容器。这种方法虽对适用场景有所限制,但其核心思路对于优化 SwiftUI 视图性能具有重要的借鉴价值。

原文中的代码较为分散,我已将其整理并汇总至 Gist,方便阅读和参考。

XCode 虚拟目录万年问题探究与我的开源工具解决方案

长期以来,Xcode 采用虚拟目录管理项目,不仅导致多人协作时合并冲突频繁,也对 CI/CD 流程和现代工具的兼容性不友好。随着 Apple 逐步优化 Xcode 目录管理,现代 Xcode 项目已更多依赖实际文件结构,但对于历史遗留项目,虚拟目录仍然是一个棘手的问题。在本文中,ZhgChgLi 详细分析了虚拟目录的影响,并介绍了他的开源工具 XCFolder。该工具可自动将 Xcode 项目中的虚拟目录转换为实际文件目录,使项目结构更加清晰,同时兼容 XcodeGenTuist,为 Xcode 项目的现代化管理提供了一种高效的解决方案。

SwiftUI 性能优化:如何有效结合 UIKit (SwiftUI Performance - How to use UIKit)

随着 SwiftUI 功能的不断丰富,越来越多的开发者选择以 SwiftUI 为核心构建应用,同时在性能关键的场景中引入 UIKit 以优化体验。在本文中,Majid Jabrayilov 探讨了如何在 SwiftUI 架构下合理结合 UIKit,以兼顾开发便捷性和运行效率。文章重点介绍了 UIHostingConfiguration——一个能够在 UITableViewCellUICollectionViewCell 内高效集成 SwiftUI 视图的机制。通过这种方式,开发者可以充分利用 UIKit 的高效视图复用,同时保持 SwiftUI 组件的灵活性,从而提升应用在处理大规模数据时的流畅度。

清理 Xcode 垃圾文件,释放 Mac 磁盘空间 (How to Clean Xcode Junk and Reclaim Valuable Disk Space on Your Mac)

对于苹果开发者来说,Xcode 占用大量磁盘空间是一个常见问题,影响系统性能和开发效率。Karin Prater 在本文中详细解析了 Xcode 生成的各种文件类型,并提供了一系列安全、高效的清理方法,帮助开发者释放磁盘空间,优化开发环境。

从零到一:构建复杂系统的探索之路 (Building Complex Things)

传统的 macOS CI 运行环境(基于 Mac 物理机)易受到外部干扰,导致环境漂移和构建不稳定。Paul Samuels 旨在通过引入虚拟化技术,使 CI 运行环境更加可控和可复用。在这篇文章中,Paul 分享了他的构建过程,从最初的问题定义、工具调研,到原型验证,最终实现了一个稳定且可重复使用的解决方案。这不仅是一次技术探索,更展示了复杂系统构建的全过程。

往期内容

THANK YOU

如果你觉得这份周报或者我的文章对你有所帮助,欢迎 点赞 并将其 转发 给更多的朋友。

weekly.fatbobman.com 订阅本周报的电子邮件版本。访问我的博客 肘子的 Swift 记事本 查看更多的文章。加入 Discord 社区,与 2000+ 中文开发者深入交流 Swift、SwiftUI 开发体验。

在嘉年华中感受苹果开发者的热情 | 肘子的 Swift 周报 #073

作者 东坡肘子
2025年3月4日 08:47

issue-73.webp

weekly.fatbobman.com 订阅本周报的电子邮件版本。访问我的博客 肘子的 Swift 记事本 查看更多的文章。加入 Discord 社区,与 2000+ 中文开发者深入交流 Swift、SwiftUI 开发体验。

在嘉年华中感受苹果开发者的热情

为期两天的 Let's Vision 2025 在欢乐的氛围中圆满落幕,这是我作为讲师第二次参与此项盛会。与去年相比,今年的活动不仅全面覆盖了苹果开发生态,还融入了当下最炙手可热的 AI 领域内容。

于我而言,收获远不止于从众多专家的分享中的汲取知识,更珍贵的是与全球各地开发者面对面深入交流的机会。其中不少是我长期在线上关注或互动的同行。那份面对面的微笑与交谈,带来了网络世界无法替代的真实连接。

真正令我惊叹的是今年活动的规模与形式。组委会将会场选在了远离上海市中心的一处园林中,起初得知地点时,我曾担忧距离会削弱参与热情。然而抵达现场后,嘉年华式的场地布置、热烈的氛围,加上天公作美的好天气,点燃了所有人的激情。这种看似"另类"的选择,最终效果却出人意料地精彩。除了数十场专业演讲外,众多参展商为与会者带来了新颖的产品与创意。尤其值得称赞的是,组委会为许多小团队和个人开发者提供了免费展示平台,不仅让他们展示作品,还创造了相互交流及与潜在投资者对接的宝贵机会。

让所有与会者惊讶的是,如此大规模的活动,组委会成员竟全部是利用业余时间筹办。他们各自都有本职工作,这不仅需要卓越的时间管理和项目协调能力,更需要对社区的真挚热爱作为坚实支撑,方能全情投入其中。对于他们的无私奉献,最好的感谢方式莫过于见证苹果开发社区蓬勃发展的景象。每个人既是参与者,也是社区愿景的共同缔造者。

这几天充实而忙碌,难免有些疲惫。本期周报部分内容是在归途中完成的,但一想到即将与家人和我心爱的猫狗重聚,疲惫感便瞬间烟消云散。衷心期盼,这种嘉年华般的活动氛围能在苹果开发生态中生生不息,长久延续。

前一期内容全部周报列表

原创

Animatable 协议:让 SwiftUI 动画不再“失控”

在 SwiftUI 开发中,你是否遇到过看似正确的动画代码却无法按预期工作的情况?或者在某些 iOS 版本上完美运行的动画,却在其他版本上表现异常?这些令人困扰的动画问题往往可以通过一个强大而低调的工具来解决 —— Animatable 协议。本文将探讨如何用 Animatable 提升动画的精准度和一致性,让 SwiftUI 动画更稳定、精准。

近期推荐

Swift 6.1 在并发上的变化 (New Concurrency Stuff with 6.1)

Swift 6.1 将随 Xcode 16.3 一并提供,Matt Massicotte 在本文中介绍了几个 Swift 6.1 并发方面的改进。尽管没有革命性的新特性,但这些调整有助于提升开发体验,减少心智负担。

isolated deinit() 原计划在 6.1 中引入,以支持析构方法的 Actor 隔离,但目前已被推迟至未来版本。

Task.sleep() vs. Task.yield(): The differences explained

在 Swift 并发中,Task.sleep()Task.yield() 都会暂停任务的执行,但方式不同。Antoine van der Lee 在本文中解释了它们的差异:Task.sleep() 让任务暂停指定时间,不阻塞底层线程,并支持取消;Task.yield() 则让当前任务主动让出执行权,使其他任务有机会运行,但如果没有更高优先级的任务,可能不会产生实际作用。一般来说,Task.sleep() 适用于引入固定延迟,如防抖输入或限流请求,而 Task.yield() 更适用于测试和优化任务调度。

基于枚举构建 ViewModel (An Ode to Swift Enums: The View Models That Could)

Swift 枚举不仅仅是多选值的集合,它们还能作为轻量级的 ViewModel,提升代码的清晰度和可维护性。Jordan Morgan 在本文中展示了 Swift 枚举的多种高级用法,例如通过 CustomStringConvertible 提供友好的 UI 展示、结合 Identifiable 适配 SwiftUI Picker、利用 CaseIterable 遍历所有枚举值等。此外,他还探讨了如何利用关联值表示更复杂的状态(如任务进度),甚至在依赖注入和 Mock 数据 场景中发挥作用。

用 ShazamKit 实现音乐识别 (Music recognition with ShazamKit)

ShazamKit 让开发者能够轻松在 iOS 应用中集成音乐识别功能。自 iOS 17 起,该框架引入了现代并发 API,简化了数据流处理,并减少了对 AVAudioEngineSHSessionDelegate 的手动管理。在本文中,Artem Novichkov 详细讲解了如何使用 SHManagedSession 进行实时音乐匹配,并通过 SHLibrary 管理识别历史。此外,文章还提供了完整的示例代码,展示如何在 SwiftUI 中构建音乐识别界面,并扩展 SHMediaItem 以支持 Spotify 和 YouTube 搜索等功能。

OpenSwiftUI 0.1.5

上周,OpenSwiftUI 发布了 0.1.5 版本,最大的亮点是新增了对 onAppearonDisappear 的支持。尽管当前仍无法渲染视图,但在 Xcode 16.3 下,以下代码已经能够生成与 SwiftUI 完全一致的输出结果,标志着 OpenSwiftUI 在功能对齐方面迈出了重要一步。

struct OpenSwiftUIContentView: View {
  @State private var first = true
  var body: some View {
    Color(uiColor: first ? .red : .blue)
      .onAppear {
        print("View appear")
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
          first.toggle()
        }
      }
      .onDisappear {
        print("View disappear")
      }
      .id(first)
  }
}

Harmony

Harmony 是由 Gülenay Gül 开发的开源音乐播放器应用,采用 SwiftUI、TCA 和 SharingGRDB 构建,拥有简洁优雅的 UI 以及清晰的代码结构。无论是想了解如何组织 SwiftUI 项目,还是如何利用 TCA 进行状态管理,Harmony 都是一个优秀的参考示例。此外,Gülenay 也欢迎更多开发者参与贡献,共同完善这个项目。

往期内容

THANK YOU

如果你觉得这份周报或者我的文章对你有所帮助,欢迎 点赞 并将其 转发 给更多的朋友。

weekly.fatbobman.com 订阅本周报的电子邮件版本。访问我的博客 肘子的 Swift 记事本 查看更多的文章。加入 Discord 社区,与 2000+ 中文开发者深入交流 Swift、SwiftUI 开发体验。

用 Swift 来构建安卓应用 | 肘子的 Swift 周报 #071

作者 东坡肘子
2025年2月18日 07:56

issue71.webp

weekly.fatbobman.com 订阅本周报的电子邮件版本。访问我的博客 肘子的 Swift 记事本 查看更多的文章。加入 Discord 社区,与 2000+ 中文开发者深入交流 Swift、SwiftUI 开发体验。

用 Swift 来构建安卓应用

近日,Swift 社区成立了 Swift on Android Community Workgroup,旨在推动 Swift 在 Android 生态中的应用。这一举措与 Arc 浏览器推动 Swift 在 Windows 平台发展的路径类似,专注于跨平台开发的 Skip 团队也有成员加入了该工作组。虽然目前还处于起步阶段,但这无疑标志着 Swift 社区正在为打破平台界限迈出重要一步。

对于深耕苹果生态的开发者而言,使用熟悉的 Swift 语言开发 Android 应用是一个令人期待的可能性。不过,跨平台开发的道路并不平坦。Swift 生态中的大量基础设施,从官方框架到众多第三方库,都与苹果平台有着千丝万缕的联系。若要实现真正的跨平台开发,社区需要构建起一整套与平台无关的 API 体系,这对普通开发者来说仍是一个不小的挑战。

令人欣喜的是,开源社区正在为 Swift 的跨平台之路贡献力量。OpenSwiftUI 项目最近公开了 ViewList 相关的代码实现,这是理解 SwiftUI 中 View 协议未公开 API 的关键部分。结合 OpenGraph 的实现进度,OpenSwiftUI 的开发节奏有望加快,一个支持基础视图功能的版本有不小的希望会在未来几个月内与开发者见面。与此同时,Point-Free 团队推出的 Sharing GRDB 项目为跨平台数据持久化提供了全新思路。

尽管 Swift 在跨平台领域展现出了令人瞩目的潜力,但前方的挑战依然不容忽视。除了技术层面的障碍,社区生态的培育和开发工具链的完善同样重要。Swift 能否真正突破苹果生态,不仅需要社区持续不断的努力,更需要广大开发者的积极参与。

我同样期待苹果能够进一步开放其部分官方 Swift 框架。Swift 在其他平台上的成功不会动摇苹果生态的根基,相反,这种开放姿态可能会吸引更多开发者投入苹果平台的怀抱。

技术的生命力在于其开放性和普适性。一个更开放的 Swift,不仅能够推动跨平台开发的进步,还能为整个开发者社区带来更多创新和可能性。让 Swift 从“苹果的语言”尽快蜕变为“世界的语言”。

前一期内容全部周报列表

原创

精确掌控 SwiftUI 滚动:自定义 Paging 实现

SwiftUI 从 iOS 17 开始引入 scrollTargetBehavior,为开发者提供了更精准的滚动控制能力,例如翻页(Paging)和视图对齐。但在横屏模式下,默认的 paging 存在对齐偏移的问题。本文将通过实际案例,深入剖析 scrollTargetBehavior 的工作方式,并探讨如何自定义 ScrollTargetBehavior,实现精准、稳定的分页滚动。

近期推荐

探索 MLX Swift:工具调用 (Exploring MLX Swift: Getting Started with Tool Use)

LLM 通过调用外部工具(Tool Use)可以突破仅依赖训练数据的局限,实现实时信息获取和任务执行。Swift 开发者现在可以通过 MLX Swift 实现这一能力。Rudrank Riyam 在本文中介绍了如何在 MLX Swift 中使用工具调用,并以实时天气查询为例,演示了从定义工具、解析 LLM 调用、获取天气数据到应用数据的完整流程。相关代码可在 MLX-Outil 项目 中查看。

SwiftUI 配置深层链接

Deep Link(深层链接)允许用户直接跳转到应用内的特定页面或功能,而不仅仅是打开首页。在这篇文章中,方君宇详细介绍了 URL Scheme 和 Universal Link 的配置方法,并探讨了如何在 SwiftUI 中处理深层链接事件。文章提供了多种深层链接传递方案,包括 @AppStorage@EnvironmentObject,以支持多级视图跳转。此外,还深入讲解了 Universal Link 的配置流程,涵盖 Apple App Site Association (AASA) 文件部署、Xcode 关联域名设置以及修改 AASA 文件后生效的时间延迟问题,帮助开发者更好地理解和应用深层链接技术。

用 TranslateKit 实现本地化 (Swift Localization in 2025: Best Practices You Couldn’t Use Before)

尽管 String Catalogs 大幅改善了 Xcode 项目的本地化效率,但其以英文文本作为键的方式,虽然提升了可读性,却带来了缺乏分组、上下文不清、翻译一致性差等问题。Cihat Gündüz 在这篇文章中介绍了 TranslateKit,一个旨在解决这些问题的开源 Swift SDK。它提供了自动语义键生成(#tk 宏)、预翻译 UI 组件(支持 40 种语言)、上下文感知翻译等功能,使得本地化更加高效且一致。

🪜 xcconfig 文件解析 (What is a Configuration (.xcconfig) File in Xcode?)

.xcconfig 文件是 Xcode 项目中去中心化管理构建配置的重要工具,能够帮助开发者将环境变量(如 API 地址、编译选项、日志级别)从 Xcode 界面和 Swift 代码中解耦出来。相比于直接在代码或 Build Settings 手动配置,使用 .xcconfig 文件可以让环境管理更加清晰、可维护,并且更适用于 CI/CD 自动化构建,避免团队协作时的合并冲突和重复劳动。在这篇文章中,Abhinay 详细介绍了 .xcconfig 文件的创建与使用,并探讨了如何通过层级继承、变量引用来优化项目配置。此外,他还分析了 CocoaPods 与 .xcconfig 可能产生的冲突,并提供了解决方案,确保 Pods 依赖能够正确加载。

Swift 与 C 互操作 (Swift Interoperability with C)

Swift 可以与 C 代码进行无缝互操作,从而让开发者在 Swift 项目中调用 C 语言编写的库。在这篇文章中,Mirza Učanbarlić 演示了如何创建一个简单的 C 库并在 Swift 中使用它,涉及编译 C 代码、生成静态库、创建 Clang 模块 (module.modulemap) 以及在 Swift 代码中调用 C 函数。此外,Mirza 还介绍了 Swift 编译器 (swiftc) 在处理 C 互操作时的关键参数,如 -I-L-lfoo,确保 C 代码可以正确链接到 Swift 项目。对于需要在 Swift 中集成 C 代码的开发者来说,这是一篇非常实用的入门指南。

Let's Vision 2025

LET’S VISION 是中国最大、最具国际化的 Apple 生态盛会,被誉为 Apple 生态中的“超级盛典”。本届大会将在 2025 年 3 月 1 日 —— 3 月 2 日上海鲜花港 举办,主题为:人工智能 + 空间计算 = 无限♾️ 。活动将带领你走在 Apple 生态的最前沿,展示最创新、最尖端的产品与技术。无论你是开发者、创业者,还是行业精英,这将是你不可错过的年度盛会!

请访问 Let's Vision 大会官网 了解更多活动详情和嘉宾名单。学生可以享受半价购票优惠。点击此处 可九折购买门票

上期周报 的抽奖活动中,Cocoa 获得了一张 Let's Vision 2025 Basic Pass。此外,Restaurant Gu推特抽奖 中同样赢得了一张 Basic Pass。感谢大家的热情参与!

往期内容

THANK YOU

如果你觉得这份周报或者我的文章对你有所帮助,欢迎 点赞 并将其 转发 给更多的朋友。

weekly.fatbobman.com 订阅本周报的电子邮件版本。访问我的博客 肘子的 Swift 记事本 查看更多的文章。加入 Discord 社区,与 2000+ 中文开发者深入交流 Swift、SwiftUI 开发体验。

❌
❌