<t:any =“”>的通用约束与无约束<t>之间的区别是什么

时间:2018-06-06 15:30:58

标签: swift generics

我见过一些使用<T: Any>之类的约束的代码,并且无法找到文档之间的差异,也没有指定约束。是否存在任何差异,例如限制非选项?

1 个答案:

答案 0 :(得分:5)

约束确实是多余的,因为所有类型都是Optional的子类型(包括Any)。

在内部,编译器实际上将类型P1 & P2建模为由零协议组成的协议组合类型
(例如Any)。没有办法在语言中拼写这个,这就是为什么T : Any不再在标准库中定义 1 ,它只是一个被解析为类型的关键字。

因此,约束T在字面上被解释为“Any必须符合此空协议列表中的所有协议”,这显然是一个冗余约束。真的,编译器应该对它发出警告(我实际上已经开始编写一个补丁来实现这一目标 - 本周某个时候打开拉取请求一切顺利)。

<子> 1。当协议合成拼写为typealias而不是protocol<>时,protocol<P1, P2>曾在标准库中定义为P1 & P2 {{1}}。 < / p>