可变的—通过Swift 4中的keyPath跟踪更改

我已经阅读了一些有关单向架构的文章。 有趣的是,您最想在状态更改时更新UI。 基本上,您将只观察状态更改,该更改将发送整个更改的状态,视图将在此状态下相应刷新。 问题在于,在UIKit中,我们没有虚拟DOM,它只能优化状态更改后需要刷新视图的部分中的视图刷新。 解决此问题的一种好方法是发送枚举,该枚举表示除了状态值本身之外状态上发生的更改。 但是我意识到,由于Swift 4中有keyPath,我们可以尝试使用它们来记录更改。
这就是我的意思,因此我编写了一个名为Changeable的小型框架,您可以在github上找到它。
Changeable框架是可容纳对象的任何类型的包装,并为您提供以下功能:

  • 通过keyPath set属性更改
  • set方法不会立即应用更改
  • commit方法将应用由set添加的未决更改
  • reset方法将还原触发set's所有未完成的更改
  • 观察commitset所做的更改

可以,但是如何运作,对吗?
我将只关注实现的某些部分。 您可以在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上进行测试。