故事 这周,我的同事问了我一个问题:在 SwiftUI 中怎么观察用户对 Picker 的选择行为? 这是一个来自真实业务的问题,所以我觉得值得我花费时间去解决它。 范例代码如下所示,然后我的同事想观察用户对 Picker 候选项的选择行为。 分析 但是,「观察」本身的意义可能会随着上下文变动而变动: 它可以表示用户在 Picker 上放下手指的那一刻。 它可以表示用户在 Picker 上抬起手指的那一刻。 它可以表示 Picker 对 $selection 进行值变更的那一刻。 上述每一项都将导致不同的最终解决方案。 因为 SwiftUI 控件可以使用 style…
前言 苹果在 WWDC 2019 向开发者介绍了 SwiftUI。多数人也许会将 SwiftUI 看成又一个如 Flutter 或者 React.js 又或者 Vue.js 这样踩在声明式、无状态 UI 编程潮流浪尖的 UI 框架。虽然 SwiftUI 与上述框架有着非常多的共同点,但是 SwiftUI 从设计到实现上都与上述框架有着本质的不同。 实际上,相较于是一个编程框架,SwiftUI 更加像是一种编程语言。不相信?让我来看看一个用「原生」SwiftUI 代码编写的斐波那契数列计算程序。 然后通过添加以下两行代码,我们可以在 Swift Playground…
通过 WWDC 2023,我们了解到 Swift 宏的目标是: 消除重复代码 让繁琐的事情变得简单 以软件包的形式与其他开发者分享 然而,这些目标并不是 Swift 宏所独有的。对于 Swift 中的许多代码重用手段而言,这些都是共同的目标,如函数、类型和模块。可以说,所有高级编程语言都希望实现这些目标。Swift 宏必须在其他方面有所胜出;否则的话没必要存在。 那么, Swift 宏到底擅长什么? 这个问题的答案至关重要。 Swift 宏独一无二的优势会决定它的本质:这可以指导我们创作有效的 Swift 宏、告诉我们在创作宏时的行为边界,并最终帮助我们产出良好设计的 Swift…
在之前的文章中,我们学习了使得 Swift 宏独一无二的优势和本质。文中的示例工作正常,但是我们现在可以放心大胆地实现任何 Swift 宏了吗? 答案是否定的。 给 Swift 宏带来优势的特性也会引入陷阱与缺陷,从而让程序员自己给自己造成麻烦。在本文中,我想向你展示我发现的一些问题以及避免它们的方法。 陷阱与缺陷 控制流的潜在混乱 在之前的文章中的 #unwrap 示例中,Swift 宏展开可能涉及到 控制流操控 和 词法作用域共享 : 展开之前: 展开之后: 由于示例宏展开中涉及控制流的 return…