主页
OneV's Den
Cancel

在上一篇关于 TCA 的文章中,我们看到了绑定的工作方式以及 Environment 在管理依赖和提供易测试性时发挥的作用。在这篇文章中,我们会继续深入,来看看 TCA 中的两个重要话题:Effect 角色到底是什么,以及如何通过组合的方式来把多个小 Feature 组合在一起,形成更加复杂的 UI 结构。 如果你想要跟做,可以直接使用上一篇文章完成练习后最后的状态,或者从这里获取到...

早晨拉开窗帘,被挡住的阳光终于像是冲开了壁障一般,肆意铺在桌面上。但是窗外被风吹得摇摇晃晃的树枝,俨然是在诉说着刚刚过去的这个夜晚是何等难熬。对它们,对我们,这个冬天似乎比以往都要寒冷,大家都盼望着春天快点到来。 习惯性地打开电脑,习惯性地泡上咖啡,突然想起已经实在是到年底了。去年的年终总结被我硬生生拖到了今年,而今年我也不想再如故蹉跎。在屋子里久了,脑子显然会不清醒,于是我决定披...

在上一篇关于 TCA 的文章中,我们通过总览的方式看到了 TCA 中一个 Feature 的运作方式,并尝试实现了一个最小的 Feature 和它的测试。在这篇文章中,我们会继续深入,看看 TCA 中对 Binding 的处理,以及使用 Environment 来把依赖从 reducer 中解耦的方法。 如果你想要跟做,可以直接使用上一篇文章完成练习后最后的状态,或者从这里获取到起始...

打算用几篇文章介绍一下 TCA (The Composable Architecture),这是一种看起来非常契合 SwiftUI 的架构方式。 四年多前我写过一篇关于使用单向数据流来架构 View Controller 的文章,因为 UIKit 中并没有强制的 view 刷新流程,所以包括绑定数据在内的很多事情都需要自己动手,这为大规模使用造成了不小的障碍。而自那时过了两年后, Swif...

本文是我的新书《Swift 异步和并发》中的部分内容,介绍了关于 Swift 中结构化并发的相关概念。如果你对学习 Swift 并发的其他话题有兴趣,也许这本书可以作为参考读物。 async/await 所引入的异步函数的简单写法,可以在暂停点时放弃线程,这是构建高并发系统所不可或缺的。但是异步函数本身,其实并没有解决并发编程的问题。结构化并发 (structured concur...

本文是我的新书《Swift 异步和并发》中第一章内容,主要从概览的方向上介绍了 Swift 5.5 中引入的 Swift 并发特性的使用方法。如果你对学习 Swift 并发有兴趣,也许可以作为参考读物。 你可以在这里找到本文中的参考代码。在本文写作的 Xcode 13 beta 2 环境下,你需要额外安装最新的 Swift 5.5 toolchain 来运行这些代码。 虽...

本来买了一个树莓派打算架个 Nextcloud,实际弄好以后发现并不是很用得上。眼看新买的树莓派就要沦为吃灰大军中的一员,实在不甘心。正好家里有一面穿衣镜,趁机改造一下,做成了一个 Magic Mirror,最终效果如下。 有一些朋友好奇是怎么做到的,也会想要自己动手做一个类似的。这篇文章里我简单把这个镜子用到的材料、一些基本步骤和自己遇到的一些坑记录下来,通过说明整个过程,为大家提供...

在上篇中,我们已经看到为什么 Text,或者更准确地说,LocalizedStringKey,可以接受 Image 和 Date,而不能接受 Bool 或者自定义的 Person 类型了。在这下篇中,让我们具体看看有哪些方法能让 Text 支持其他类型。 为 LocalizedStringKey 自定义插值 如果我们只是想让 Text 可以直接接受 true 或者 false,我们可以简...

Text 中的插值 Text 是 SwiftUI 中最简单和最常见的 View 了,最基本的用法,我们可以直接把一个字符串字面量传入,来创建一个 Text: Text("Hello World") 在 iOS 14 (SwiftUI 2.0) 中,Apple 对 Text 插值进行了很多强化。除了简单的文本之外,我们还可以向 Text 中直接插入 Image: Text("He...

2021 年 9 月更新 在评论区里,@CrystDragon 指出原文章的部分 内容已经在新版本 SwiftUI 中发生了变化。不过这也带来了另一方面更加让人迷惑的问题。因此我对部分内容进行了更新和额外说明,更新部分会作为评注内 容写在相关原文的后面。 @State 基础 在 SwiftUI 中,我们使用 @State 进行私有状态管理,并驱动 View 的显示,这是基础...