Swift中的紧凑型和类型安全观察器

我一直想知道为什么像Observer这样有用的模式在Objective C和Swift中不像在Android中那样成为语言本身的一部分。 当然,还有其他通信机制可用,但它们适用于不同的情况:闭包相当本地化,侦听器唯一,通知中心相当全局,根本没有类型。 因此,我收到了将许多观察者的Android应用移植到Swift的任务,我想为什么不尝试在Swift中重复这种模式。 最后,我所看到的是一个非常整洁的实现,对其他人可能会有帮助。

为了更精确地描述任务,我们有一个拥有某种[typed]状态的对象,并且我们希望在状态改变时通知其他对象。 由于类型可以不同,显然我们必须以某种方式利用泛型。 所以第一个想法是写这样的东西:

并立即发现Swift不支持协议泛型(因为那样的话,我们将不得不编写类似Observable <K,O:Observer >之类的东西以及嵌套的泛型可能很难处理)。

幸运的是,Swift工程师创建了一个合适的替代方法,称为关联类型。 不深入探讨这种新的语言结构,下面是我们现在定义观察者的方式:

这样就定义了通用的Observable,如下所示:

与Android相比,这一切看起来仍然非常优雅和易于理解,我们只需要再走一步-我们必须为要用于观察值的每种类型定义一个特定的Observer类。 例如:

仅此而已-我们已准备就绪。 为了使我们的某些类可观察,我们只需添加模板基类:

最后,通过进行编译时类型检查,我们对Observer模式的化身甚至比Android更先进。 由于update()方法的签名根据类型的不同而不同,因此我们将把处理逻辑绑定到特定的Observer上,而不是全部都放在一个update()方法中。

该类的完整源代码可以在这里找到。