肘子的 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 订阅本周报的中英文电子邮件版本。

相关推荐
iOS阿玮2 小时前
苹果 iOS 19 曝光,你的iPhone 还能再战一年?
app·apple
Lexiaoyao204 小时前
SwiftUI 字体系统详解
swiftui·swift
YungFan4 小时前
Swift 6.1 新特性
swift
光阴独白1 天前
Apple Login for JavaScript
前端·apple
1024小神1 天前
theos工具来编译xcode的swiftUI项目为ipa文件
macos·swiftui·xcode
Invisible_He2 天前
iOS自定义collection view的page size(width/height)分页效果
ui·ios·swift·collection
无知的前端2 天前
iOS性能优化:OC和Swift实战指南
ios·性能优化·swift
iOS阿玮2 天前
都2025年,你竟然还敢买iOS的源码?
前端·app·apple
JQShan2 天前
为什么 Swift 的反射像个“玩具”?聊聊 Mirror 背后的设计哲学
面试·swift·设计
东坡肘子2 天前
MCP 崛起与苹果的 AI 框架设想 | 肘子的 Swift 周报 #077
人工智能·swiftui·swift