了解它们是什么比它们之间的区别更重要。
Any
表示“任何东西”,范围从快速枚举、元组、闭包、结构、类、协议等等。每种类型都可以分配给 type 的变量Any
。
Hashable
是说“这个对象可以被散列,即有一个散列码”的协议。如果你的对象可以被散列,实现这个协议,因为很多数据结构(即字典和集合)都需要它。
那么是什么AnyHashable
?
通常,如果您尝试这样做:
let a: Set<Hashable>?
它不编译。这是因为Hashable
继承自Equatable
which contains Self
。
现在,假设您想将一个方法从 Objective-C 移植到 swift。该方法采用 type 的参数NSSet
。在 Swift 中,这会变成Set
,但它的泛型参数是什么?如果我们Any
像使用NSArray
s 一样放置,它不起作用,因为Set
' 对象必须是可散列的。但是如果我们把Set<Hashable>
它也不起作用,因为Hashable
只能用作通用约束。这就是为什么它们用不使用的包裹起来Hashable
,因此可以AnyHashable
用作通用参数。Self
关于“类型擦除”的含义:
包含在Self
协议中有点像带有泛型参数的协议,而泛型参数始终是符合标准的类。这会导致协议无法单独使用,Set<Hashable>
因为“通用参数”是未知的。AnyHashable
通过根本不使用来解决这个问题,Self
所以它现在变成了一个普通的结构。它“擦除”泛型Self
类型。