我见过一些使用<T: Any>
之类的约束的代码,并且无法找到文档之间的差异,也没有指定约束。是否存在任何差异,例如限制非选项?
答案 0 :(得分:5)
约束确实是多余的,因为所有类型都是Optional
的子类型(包括Any
)。
在内部,编译器实际上将类型P1 & P2
建模为由零协议组成的协议组合类型
(例如Any
)。没有办法在语言中拼写这个,这就是为什么T : Any
不再在标准库中定义 1 ,它只是一个被解析为类型的关键字。
因此,约束T
在字面上被解释为“Any
必须符合此空协议列表中的所有协议”,这显然是一个冗余约束。真的,编译器应该对它发出警告(我实际上已经开始编写一个补丁来实现这一目标 - 本周某个时候打开拉取请求一切顺利)。
<子> 1。当协议合成拼写为typealias
而不是protocol<>
时,protocol<P1, P2>
曾在标准库中定义为P1 & P2
{{1}}。 < / p>