可变的—通过Swift 4中的keyPath跟踪更改
我已经阅读了一些有关单向架构的文章。 有趣的是,您最想在状态更改时更新UI。 基本上,您将只观察状态更改,该更改将发送整个更改的状态,视图将在此状态下相应刷新。 问题在于,在UIKit中,我们没有虚拟DOM,它只能优化状态更改后需要刷新视图的部分中的视图刷新。 解决此问题的一种好方法是发送枚举,该枚举表示除了状态值本身之外状态上发生的更改。 但是我意识到,由于Swift 4中有keyPath,我们可以尝试使用它们来记录更改。
这就是我的意思,因此我编写了一个名为Changeable
的小型框架,您可以在github上找到它。
Changeable
框架是可容纳对象的任何类型的包装,并为您提供以下功能:
- 通过keyPath
set
属性更改 -
set
方法不会立即应用更改 -
commit
方法将应用由set
添加的未决更改 -
reset
方法将还原触发set's
所有未完成的更改 - 观察
commit
后set
所做的更改
可以,但是如何运作,对吗?
我将只关注实现的某些部分。 您可以在github上深入研究细节。
首先,让我们关注Changeable
泛型类。
最有趣的部分是set
方法,该方法存储keyPath和闭包,这些闭包将在包装的值中应用更改,以后在commit
方法中应用更改。 因为没有简单的方法来存储keyPath并将其连接到值,所以需要applier闭包,因为WritableKeyPath
是一个通用类,不能轻易以任何顺序存储。 我可以使用AnyKeyPath
但是再次必须将它们转换为WritableKeyPath
因为只有这种keyPath可以用于更改属性。 幸运的是, AnyKeyPath
以及WritableKeyPath
都具有hashValue
,该值可以帮助我将特定的keyPath与应用程序的闭包关联起来。 值得一提的是, hashValue
仅保证在程序的一次执行中有用。 但是因为我们不需要将其存储在存储中,所以很安全。
另外, Changeable
类具有添加观察者的能力。 我将省略许多文章中描述的观察实现。 但是更有趣的部分是,要发出然后消费更改, Changeable
使用Change
结构来保存更改的值和更改的keyPath。
这是Change
结构的整个实现:
没有太多要说的了。 我不向您解释代码,而是向您展示如何使用它:
结论
keyPath
在Swift语言中打开了一个新的可能性世界,它为该语言带来了一点活力。 我希望您会发现Changeable
是可以用来解决实际问题的工具。 让我知道你的想法。
这就是我为您准备的一切。 您会在操场上找到更多内容,并在github上进行测试。