在上篇中,我们已经看到为什么 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 的显示,这是基础...
岁月如梭,白驹过隙。年前就打算写的这篇 2020 年终总结,硬生生被拖成了 2021 的“去年回顾”。主要还是因为思前想后,觉得 2020 年实在太过特殊:在 2020 经历的事情,也许今后很长一段时间都不会再有;于是在 2020 总结的经验,似乎也很难运用于未来。不过就算如此,还是勉强写点儿什么,权当留个纪念吧。 关于疫情 疫情当然是关键词,从一个长期驻日的人眼中看来,就是“君病我未病...
本文介绍了一个使用 Swift Codable 解码时难以设置默认值问题,并利用 Property Wrapper 给出了一种相对优雅的解决方式,来在 key 不存在时或者解码失败时,为某个属性设置默认值。这为编解码系统提供了更好的稳定性和可扩展性。最后,对 enum 类型在某些情况下是否胜任进行了简单讨论。 示例代码 Codable 类型中可选值的窘 (囧?) 境 基础类型可...
SwiftUI 中提供了很多“新颖”的 API 设计思路和 Swift 的使用方式,我们可以进行借鉴,并反过来使用到普通的 Swift 代码中。PreferenceKey 的处理方式就是其中之一:它通过 protocol 的方式,为子 view 们提供了一套模式,让它们能将自定义值以类型安全的方式,向上传到父 view 去。如果有机会,我会再专门介绍 PreferenceKey,但这种设计的...
WWDC 2020 上 Swift Package Manager (SPM) 开始支持 Resource bundle 和 Binary Framework。对于 Package 的维护者来说,如果有需求,当然是应该尽快适配这些内容。首先要做的,就是将 Package.swift 中的 Swift Toolchain 版本改到最新的 5.3:只有最新的 tool chain 才具备这些功能...
WWDC 2020 中,SwiftUI 迎来了非常多的变更。相比于 2019 年的初版,可以说 SwiftUI 达到了一个相对可用的状态。从这篇文章开始,我打算写几篇文章来介绍一些重要的变化和新追加的内容。如果你需要 SwiftUI 的入门和基本概念的材料,我参与的两本书籍《SwiftUI 与 Combine 编程》和《SwiftUI 编程思想》依然会是很好的选择。 字太多,不想看...
App clips 是今天 WWDC 上 iOS 14 的一个重要“卖点”,它提供了一种“即时使用”的方式,让用户可以在特定时间、特定场景,在不下载完整 app 的前提下,体验到你的 app 的核心功能。 装好 Xcode 12 以后第一时间体验了一下如何为 app 添加 app clip。它的创建和使用都很简单,也没有什么新的 API,所以要为 app 开发一个 clip 的话,难点更多...
2018 年 3 月的时候我写过一篇在 Swift 中如何改进 Delegate Pattern 的文章,主要思想是用遮蔽变量 (shadow variable) 声明的方式,来保证 self 变量可以被常时地标记为 weak。本文中,为了保证没有看过原文的读者能处在同一频道,我会先 (再次) 简单介绍一下这种方法。然后,结合 Swift 5.2 的新特性提出一些小的改进方式。 Deleg...