肘子的 Swift 周报 #042| 经验是柄双刃剑

肘子的话

欢迎访问 weekly.fatbobman.com 订阅本周报的中英文电子邮件版本。你也可以直接访问我的博客 肘子的 Swift 记事本

几个月前,我受邀撰写一个 SwiftUI 的教程,其中包含一部分关于 SwiftData 的内容。最近当我开始准备这部分内容时,发现难度远超预期。一方面,我需要找到适合初学者的表述方式;另一方面,我需要摆脱 Core Data 对我在理解和表述 SwiftData 时造成的困扰。

是的,我在 Core Data 上的经验如今成为了一种束缚,阻碍了我用更加现代和前瞻的视角分析和理解 SwiftData。我正在努力从历史经验中提取有价值的内容,同时避免其对新知识的理解产生负面影响,虽然有些进展,但还未完全到位。

在金庸的小说《倚天屠龙记》中,张三丰当着敌人的面向张无忌传授了他自创的太极拳。直到张无忌表示他已经彻底忘记了刚才所学的套路,张三丰才认为他理解了该武功的真谛( 掌握了"道",但并不被"术"所限制 )。尽管这是小说情节,但确实揭示了一个事实:如何从经验中提取本质而不被其束缚,是一件既重要又困难的事。

当开发者面对复杂的布局和交互时,如果不深入理解 SwiftUI 独特的布局逻辑和内部运行机制,就会面临无法通过这些"简单"的 API 准确表达他们的需求。在这种情况下,一些开发者可能会误认为是 SwiftUI 的能力有限,而没有意识到问题可能出在自己对框架理解不够深入。

上面是我在文章《几个常见的关于 SwiftUI 的误解》中的一段文字。部分读者对此表示强烈反对,这些读者往往具备 UIKit 编程背景且使用 SwiftUI 时间不长。他们认为 SwiftUI 完全无法和 UIKit 媲美,许多在 UIKit 中轻松完成的工作在 SwiftUI 中难以实现。即便一些有其他声明式框架经验的开发者也认为,SwiftUI 在声明方式上有许多反直觉之处。

我从不否认 SwiftUI 在功能丰富度方面相较于 UIKit 仍有相当的差距。但是,这些开发者是否认真思考过:在学习和使用 SwiftUI 时,是否做好了转换思维的心理准备?是否抱着接受和拥抱新事物的态度来尝试 SwiftUI?你当前的"直觉"是否天生如此,还是在其他经验的基础上形成?

经验对一个人的成长很重要,但恪守经验,被其束缚反倒会影响我们走得更远。经验是柄双刃剑,让其为我所用,不要被其反伤。

前一期内容全部周报列表

原创

几个常见的关于 SwiftUI 的误解

Fatbobman( 东坡肘子 )

本文旨在探讨与 SwiftUI 有关的几个常见的误解,以帮助开发者更好地理解和运用 SwiftUI。这些误区包括:对 SwiftUI 学习难度的认知、跨平台开发的期望、框架功能的范畴、以及代码量的误解等。通过澄清这些观念,希望能为 SwiftUI 开发者提供更清晰的学习方向和使用策略。

近期推荐

使用 SwiftUI Canvas 创造魔幻粒子效果 ( Magical Particle Effects with SwiftUI Canvas )

Pavel Zak

Canvas 作为 SwiftUI 中的一个强大工具,允许开发者以更接近底层的方式绘制内容,从而显著提升运行效率。Pavel Zak 在这篇文章中展示了如何巧妙运用 SwiftUI 的 Canvas 视图来创造令人惊叹的魔法粒子效果。特别值得一提的是,文中所有炫酷的视觉效果都完全依托于 SwiftUI 框架,不仅展现了出色的视觉体验,还保证了优秀的运行性能。

从磁盘加载 UIImage 时的内存消耗 ( Memory Consumption when Loading UIImage from Disk )

Antoine van der Lee

由于 SwiftUI 不支持直接通过路径的方式加载图像,当创建大量 Image 实例后,内存消耗可能会迅速增加。Antoine van der Lee 在这篇文章中深入探讨了加载图像时的内存管理问题。作者详细分析了几种有效的优化策略:首先考虑是否确实需要将图片存储在内存中,然后探讨了使用 UIImage(contentsOfFile:) 来规避系统缓存的方法,最后提出了如何实现一个高效的图片缓存机制来减少内存占用。通过丰富的代码示例和性能对比,Antoine 展示了如何在应用性能和内存占用之间取得良好平衡。

Swift 与 TypeScript 对比速查表 ( Swift VS TypeScript Comparison CheatSheet )

Luca Ban

Luca Ban 拥有多年的 TypeScript 开发经验,最近开始使用 Swift 开发 VisionOS 应用。他发现尽管 TS 和 Swift 在理念上有些类似,但在目前进行的项目中,仍需要找到更加原生(Swifty)的方式来使用 Swift 语言。因此,他创建了这个快速参考,方便开发者在两种语言间找到等效方法。这个对照表详细列出了 TypeScript 和 Swift 中常见方法的对比,帮助开发者快速适应并提高效率。该网站还欢迎开发者们提交 Pull Request,进一步丰富内容。

提升 Xcode 模板中 SwiftData 的错误处理 ( Leveling Up SwiftData Error Handling in Xcode Templates )

Mike Buss

尽管 Xcode 为 SwiftData 应用提供了默认模板,但在错误处理方面还有很大的改进空间。Mike Buss 提出了一种更健壮的方法来处理 ModelContainer 创建时可能出现的错误。相比于默认模板中使用 fatalError() 导致应用崩溃的做法,新方法通过状态管理和自定义的错误视图,为用户提供了更友好的体验。

本文介绍的方法不仅适用于 SwiftData,还可以应用于任何在应用初始化时可能产生错误的场景。

Swift 中的 async/await:完整工具箱 ( Async await in Swift: The Full Toolkit )

Jacob Bartlett

Jacob Bartlett 从一个常见的 iOS 面试问题出发,全面讲解了 Swift 并发工具箱中的核心组件,包括 async/await、async let、Task、Task group、Actor、MainActor、Sendable、Continuations、AsyncSequence、AsyncStream 以及 Async Algorithms。对于每种工具,Jacob 不仅解释了其基本概念和语法,还提供了实际应用场景和代码示例,帮助读者理解何时何地使用这些工具最为合适。

在 Xcode 16 中使用 @DebugDescription ( Using @DebugDescription in Xcode 16 )

Aryaman Sharda

在 Swift 中,CustomDebugStringConvertible 协议让开发者可以自定义数据在调试状态下的表述方式以优化体验。在本文中,Aryaman Sharda 介绍了 Xcode 16 新增的 @DebugDescription 宏,该宏在 CustomDebugStringConvertible 的基础上更进了一步,允许开发者直接在 Xcode 的变量检查器中看到自定义的调试描述,而无需使用 printpo 命令。作者指出,清晰、信息丰富的调试输出对于理解代码行为至关重要。

往期内容

THANK YOU

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

欢迎访问 weekly.fatbobman.com 订阅本周报的中英文电子邮件版本。

相关推荐
报错小能手6 小时前
ios开发方向——swift错误处理:do/try/catch、Result、throws
开发语言·学习·ios·swift
小夏子_riotous9 小时前
openstack的使用——5. Swift服务的基本使用
linux·运维·开发语言·分布式·云计算·openstack·swift
mCell13 小时前
MacOS 下实现 AI 操控电脑(Computer Use)的思考
macos·agent·swift
用户794572239541313 小时前
【DGCharts】iOS 图表渲染事实标准——8 种图表类型、高度可定制,3 行代码画出一条折线
swiftui·swift
chaoguo12341 天前
Any metadata 的内存布局
swift·metadata·value witness table
tangweiguo030519872 天前
SwiftUI布局完全指南:从入门到精通
ios·swift
用户79457223954133 天前
【RxSwift】Swift 版 ReactiveX,响应式编程优雅处理异步事件流
swift·rxswift
战族狼魂3 天前
XCode 发起视频 和 收到视频通话邀请实现双语功能 中文和俄语
swift
UXbot3 天前
2026年AI全链路产品开发工具对比:5款从创意到上线一站式平台深度解析
前端·ui·kotlin·软件构建·swift·原型模式
报错小能手3 天前
ios开发方向——swift并发进阶核心 @MainActor 与 DispatchQueue.main 解析
开发语言·ios·swift