Swift关联类型设计模式
Swift是一种多范式编程语言,这意味着您可以进行面向对象,面向方面,过程,功能或弹出式编程。 仅举几例。 最后一个“ pop”表示面向协议的编程。 在WWDC 2015的本届会议上,一切都发生了变化,Dave Abrahams在会议上发表了关于这一概念和新思维方式的演讲。 他首先说:
新思维方式:
接下来的40分钟将搁置您通常的编程思考方式。 我们在这里要在一起做的事情不一定很容易,但是我向你保证,如果你坚持我的看法,那将是值得的。
如果您没有看过视频,我郑重建议您现在就观看视频。 因为我在本文中要做的就是分解同一段视频。
同年,Alexis Gallagher发表演讲,他试图解决使用快速编程语言使用关联类型时遇到的一些困难。 这不是一个容易理解的概念,Benedikt Terhechte撰写了有关此主题的文章,Russ Bishop也撰写了他的有关关联类型的回忆录,John Sundell也向关联类型致敬。 罗伯特·爱德华兹(Robert Edwards)详细介绍了类型擦除,李嘉诚(Lee kah Seng)撰写了有关如何在与协议相关类型一起工作时如何实现动态调度的发现。 他们都试图了解参数多态性是如何工作的。
令人讨厌的错误消息的美丽:
由于协议具有自身或关联的类型,因此只能用作通用约束。
每当您看到上述错误时,便会烦恼并开始粉碎键盘。 让我们确切地定义什么是关联类型。
关联类型的定义:
associatedtype
是未知Concrete Type
的协议通用占位符,需要在编译时采用具体形式。
编译时与运行时的清晰度:
运行时和编译时是指软件应用程序不同阶段的编程术语。 编译时是将代码转换为可执行代码的实例,而运行时是转换后的可执行代码实际执行的实例。
关联类型的起源:
这个概念首先出现在“ 函数式编程杂志 ”上的出版物中, 该出版物的标题是: 泛型编程语言支持的扩展比较研究 。 他们着重强调多类型概念 ,这是Swift协议associatedtypes
的根源。 Swift还从Scala的Traits和Abstract类型 , Haskell的多参数类型类中获得了一些启发。 以及Rust相关类型 。 然后,它将标准库中的“ 多类型概念”用于其集合类型。
关联类型解决的问题:
- 引入了
associatedtype
来解决丰富的多类型抽象问题,而后者在面向对象的子类型化中不可用。 - 设计用于解决已知的朴素
generic protocol
实现,尤其是在复杂性随通用类型引入增加而严重恶化的情况下。 - 保持静态类型安全,同时使语言更具表现力。
关联类型的优点:
- 它们有助于避免实现细节泄漏,通常需要重复指定这些细节。
- relatedtype捕获
Types
之间丰富的Type
关系。 - 它们有助于在协议子
Type
中指定对象的精确Type
,而不会污染Type
定义。 - 它们提供了您无法适应与对象相关的类型层次结构的关系,尤其是在Liskov替换原理无法解决
Type
多态关系的情况下。 - 它们执行同质集合,从而通过优化的静态分派代码增强编译器。
相关类型的警告:
- 难以理解,因为它具有较高的学习曲线。
- 它往往使您无法进行动态调度。 通过执行静态调度。
- 它只能在协议内使用。
关于动态分派与静态分派的清晰性:
动态调度是选择要在运行时调用多态操作(方法或函数)的哪种实现的过程,而静态调度是完全解决的编译时形式的多态操作。
处理关联类型:
声明具有关联类型的协议非常简单,正如我们在下面的示例中看到的:
其他文章:
- MVVM❤️RxSwift❤️Swift 4.x版本
- 使用Swift进行声明式编程
- 扎实的原则-依赖倒置
- 坚实原则-接口隔离
- 扎实的原则-Liskov替代
- 牢固原则-打开/关闭
- 扎实的原则-单一责任
- 快速访问级别。 文件私有