Swift 3中Any,Hashable,AnyHashable有什么区别?

时间:2017-06-13 06:19:27

标签: ios swift swift3 associated-types hashable

我通过大量的教程来理解上述3个术语之间的区别并找到新的术语type erased容器,现在它让我感到困惑。这引起了很多疑问。

为什么Swift引入AnyHashable

这3个术语有什么根本区别?

AnyAnyHashable之间的区别?

HashableAnyHashable之间的区别?

何时使用Hashable以及何时使用AnyHashable

最后但最令人困惑的是,type erased背景下AnyHashable字词的含义是什么?

我跟着Swift Evolution Proposal SE-0131

1 个答案:

答案 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只能用作通用约束。这就是为什么他们将HashableAnyHashable包裹在一起

}的原因可以用来作为通用参数。

关于什么&#34;类型擦除&#34;的意思是:

协议中有Self类似like a protocol with a generic parameter,泛型参数始终是符合要求的类。这导致协议无法像Self那样单独使用,因为&#34;泛型参数&#34;不明。 Set<Hashable>完全没有使用AnyHashable来解决这个问题,现在它变成了一个普通的结构体。它&#34;擦除&#34;通用Self类型。