我通过大量的教程来理解上述3个术语之间的区别并找到新的术语type erased
容器,现在它让我感到困惑。这引起了很多疑问。
为什么Swift引入AnyHashable
?
这3个术语有什么根本区别?
Any
和AnyHashable
之间的区别?
Hashable
和AnyHashable
之间的区别?
何时使用Hashable
以及何时使用AnyHashable
?
最后但最令人困惑的是,type erased
背景下AnyHashable
字词的含义是什么?
答案 0 :(得分:10)
了解它们的含义比它们之间的差异更为重要。
Any
表示"任何",包括快速枚举,元组,闭包,结构,类,协议等等。可以将每种类型分配给Any
类型的变量。
Hashable
是协议,表示"此对象可以进行哈希处理,即具有哈希码"。如果您的对象可以进行哈希处理,请实现此协议,因为许多数据结构(即字典和集合)都需要它。
那么AnyHashable
是什么?
通常情况下,如果您尝试这样做:
let a: Set<Hashable>?
它无法编译。这是因为Hashable
继承自Equatable
,其中包含Self
。
现在,让我们假设你要将一个方法从Objective-C移植到swift。该方法采用类型NSSet
的参数。在Swift中,这将转变为Set
,但它的通用参数是什么?如果我们像Any
一样放置NSArray
,那么它就不起作用,因为Set
的对象必须是可以清除的。但是如果我们放Set<Hashable>
它也不起作用,因为Hashable
只能用作通用约束。这就是为什么他们将Hashable
与AnyHashable
包裹在一起
关于什么&#34;类型擦除&#34;的意思是:
协议中有Self
类似like a protocol with a generic parameter,泛型参数始终是符合要求的类。这导致协议无法像Self
那样单独使用,因为&#34;泛型参数&#34;不明。 Set<Hashable>
完全没有使用AnyHashable
来解决这个问题,现在它变成了一个普通的结构体。它&#34;擦除&#34;通用Self
类型。