Swift 扩展中的 KVO

KVO within Swift Extension

我如何让我的扩展程序在 class 上观察 属性 它正在扩展,同时还能够在以后删除它?

例如:

我有一个 UIView,我想监听 UIView 扩展中的框架变化。当这些变化发生时,我需要 运行 一些代码来根据新框架改变视图外观。

我遇到的问题是,虽然我可以设置一个观察器,但我无法找到删除它的方法。没有 deinit() 并且我希望观察者在 UIView 的生命周期中停留。

我宁愿不必将此删除责任推给开发者,我也不想子class。

甚至不必是 KVO,如果有更好的方法我很想知道。

同时

Extensions can add new convenience initializers to a class, but they cannot add new designated initializers or deinitializers to a class. Designated initializers and deinitializers must always be provided by the original class implementation.

所以我认为如果不进行子类化,您将无法以任何好的方式处理它。

通常的解决方案是使用关联对象作为释放间谍。关联对象在它们的附加对象被释放时被释放,因此您可以 运行 在它们的 deinit 中编写代码,当附加对象消失时要触发。也就是说,至少可以说,在多线程世界中真正做到这一点有点棘手。我不建议建立你自己的。相反,我建议使用 PMKVObserver 来为您处理这个问题。即使您确实选择构建自己的,也应该研究 PMKVObserver 如何发挥其魔力,这样您的实现就不会过于幼稚。

在 Swift 中马虎地做这件事(不用担心多线程竞争条件)并不难,但要真正做好,最好在 ObjC 中完成并桥接到 Swift。再次,请查阅代码以了解棘手的极端情况。