有时候我认为类型理论是故意弄的很复杂,以及所有的那些函数式编程追随者都只是胡说八道,仿佛他们理解了其中的含义。真的吗?你有一篇 5000 字的博客是写关于插入随机类型理论概念的吗?毫无疑问的没有。a)为什么有人会关心这些以及b)通过这个高大上的概念能帮我们解决什么问题?我想把你装进麻布袋里,扔进河里,并且砸进一个坑 里。
我们在讨论什么?当然,关联类型。
当我第一次看到 Swift 范型的实现时, 关联类型的用法的出现,让我感到很奇怪。
在这篇文章,我将通过类型概念和一些实践经验,这几乎都是我用自己的思考尝试解释这些概念(如果我犯了错误,请告诉我)。
范型
在 Swift 中,如果我想有一个抽象的类型(也就是创建一个范型的 东西 ),在类中的语法是这个样子:
class Wat{ ... }
类似的,带范型的结构体:
struct WatWat{ ... }
或者带范型的枚举:
enum GoodDaySir{ ... }
但如果我想有一个抽象的协议:
protocol WellINever {
typealias T
}
嗯哼?
基本概念
protocol 和 class 、struct 以及 enum 不同,它不支持范型类型 参数 。代替支持 抽象类型成员 ;在 Swift 术语中称作 关联类型 。尽管你可以用其它系统完成类似的事情,但这里有一些使用关联类型的好处(以及当前存在的一些缺点)。
协议中的一个关联类型表示:“我不知道具体类型是什么,一些服从我的类、结构体、枚举会帮我实现这个细节”。
你会很惊奇: “非常棒,但和类型参数有什么不同呢?” 。一个很好的问题。类型参数强迫每个人知道相关的类型以及需要反复的指明该类型(当你在构建他们的时候,这会让你写很多的类型参数)。他们是公共接口的一部分。这些代码