符合条件概览

Swift 4.1已有几天推出,并且具有一个有趣的功能: 条件一致性 。 这是用于实现面向协议的编程以及API设计的新工具。 这篇文章是对这种崭新技术的快速介绍,并且肯定会在接下来的几周内进行深入探讨。

和往常一样,您可以在我的个人博客上找到原始帖子。

借助Swift,您可能会对实现扩展的所有不同方式感到困惑。 随着语言的成熟,出现了新的扩展可能性,开发人员必须选择合适的语言。

基本上,扩展允许扩展类型的行为而不必将其子类化:

进行实用程序功能或实现有效的工厂模式很有用。

对专用于泛型类型的基本扩展进行了改进:

例如,将sum()函数应用于Bool数组可能没有意义。 这种扩展允许开发人员将新功能引入现有类型,但使它们可以安全地同时使用。 当您设计供其他开发人员使用的API时,这非常有用。 一旦满足良好要求,他们就可以一次“免费”地受益于某些代码。

扩展不仅可以将行为添加到现有类型,还可以修改类型本身以使其符合协议。

这在存在异质性的地方带来了一致性。 如果不使StringIntsOptionals符合相同的协议,就不可能将它们混合在一起。

但是,尽管Array的每个元素都是“ Resettable ”,但我们仍然必须对其进行解析(使用map )并在每个元素上调用“ reset() ”以实现全局操作。

有条件的一致性将大大帮助希望重置整个Array的开发人员无缝地执行此操作。

到目前为止,我们还没有谈到面向协议的编程。 该范例具有向协议添加默认行为的能力。 符合此协议的类型也将有益于此默认行为(或覆盖它)。 这是一种特殊的扩展名,并不是本文的重点。 因此,在这里我们不要引入过多的噪音,而只关注扩展具体类型的能力。

条件一致性是Swift 4.1随附的全新功能。 它是条件扩展一致性扩展之间的混合。 如此,它继承了它们的两个关键原则:

  • 带来了新功能,但使它们可以安全同时使用
  • 在存在异质性的地方带来一致性

实际上,其背后的主要思想之一是:如果可以将行为应用于超集的每个元素,那么我们可以考虑将该行为也应用于超集本身:

由于Array的每个元素都是Resettable ,因此整个Array也是。 例如,这正是苹果公司对Equatable和Hashable所做的事情。 使用Swift 4.1时,等于数组的元素数组是等于数组的。

在我们的示例中,最大的功能是,我们可以在根Array中嵌入一个Resettables数组,并且仅使用一条语句“ resettableArray.reset() ”,即可重置整个数据结构。 这是处理递归的一种非常优雅的方法。

如我们所见,就API设计而言,与基本的“ 一致性扩展 ”相比,使用“ 条件一致性 ”具有很大的优势。 API设计人员将在他的框架中内部化他认为很聪明的代码(此处为reset()函数),以免费提供给符合相应要求的开发人员。

有某些类型的设计模式可以受益于条件一致性所带来的使行为适用于“容器”类型的能力。 同样,这通常是从API设计人员的角度来看的。

访客是一个非常简单的设计模式,它允许外部化数据结构的解析。 如果需要详细说明:访问者模式。

在这里,我们将实现“人和汽车”的数据结构,即“可访问者 ”。 如果符合条件,“ Visables容器也将是“ Visible ”:

要访问一堆Visitables ,您要做的就是将它们添加到诸如ArrayDictionnary之类的容器中并访问该容器。 从开发人员的角度来看,只需实施AnyVisitor

在Xcode中使用条件一致性有一个小缺点。 如果返回到Resettable示例,则Bool不是Resettable,但是如果声明Array ,则Xcode将提供具有自动完成功能的“ reset( )”函数。

当然,编译器随后会通知您Bool不是Resettable……但是,也许Xcode可能更具限制性! 没什么大不了的,但我必须指出。

我希望您喜欢有条件遵循的第一个方法。 肯定会在未来几周内出现新用法。

敬请关注。