概览
在上一篇博文 Swift 中强大的 Key Paths(键路径)机制趣谈(上)中,我们介绍了 Swift 语言中键路径机制的基础知识,并举了若干例子讨论了它的一些用武之地。
而在本文中我们将再接再厉,继续有趣的键路径大冒险,为 KeyPaths 画上一个圆满的句号。
在本篇博文中,您将学到如下内容:
- 概览
- 4. 以不变应万变:超越对象实例
- 5. 可写(Writable)键路径
- 总结
相信学完本系列两篇博文之后,小伙伴们定能在今后的撸码中对键路径了然于胸、驾轻就熟。
那还等什么呢?Let‘s go!!!😉
4. 以不变应万变:超越对象实例
虽然“进化后”的键路径语法糖“很好很强大”,但键路径真正的威力来自于这样一个事实:即它们允许我们引用对象属性,却不必将其与任何特定实例相关联。
这是什么意思呢?
还拿之前那个音乐播放器 App 的“栗子”来说,假设现在我们正在开发显示歌曲列表的功能,为了在 UI 中配置 Song 模型数据的列表 UITableViewCell 子视图,我们使用如下所示的配置器(Configurator)结构:
struct SongCellConfigurator {
func configure(_ cell: UITableViewCell, for song: Song) {
cell.textLabel?.text = song.name
cell.detailTextLabel?.text = song.artistName
cell.imageView?.image = song.albumArtwork
}
}
需要再次说明的是,上面代码并没有犯什么错。
不过秃头小码农们都知道,在该 App 中我们以类似通用的方式来呈现其它模型数据的可能性很大(除了 Song 以外,App 中的其它类型也会在列表中显示标题、副标题和图像等信息),因此让我们看看是否可以使用键路径“摧枯拉朽”般的强大能力来创建可以与任何数据模型一起使用的“共享”配置器实现。
首先,我们创建一个名为 CellConfigurator 的泛型结构。由于我们希望为不同的模型呈现不同的数据,因此我们为其提供一组基于键路径的属性,对应于我们要呈现的每种数据:
struct C