2017-06-13 59 views
11

我通过大量的教程来了解我的头,以了解上述3个术语之间的区别,并找到新术语type erased容器,现在它变得让我感到困惑。它引发了很多问题。Swift 3中Any,Hashable,AnyHashable之间有什么区别?

为什么斯威夫特推出AnyHashable

这3个术语之间的根本区别是什么?

AnyAnyHashable之间的区别?

HashableAnyHashable之间的区别?

何时使用Hashable以及何时AnyHashable

最后但却最令人困惑的是,type erased术语的含义是什么AnyHashable?我跟着Swift Evolution Proposal SE-0131

+0

看到这一次https://stackoverflow.com/questions/39382852/didreceiveremotenotification-not-called-ios-10/39383027#39383027 –

回答

8

了解它们比什么是它们之间的区别更重要。

Any的意思是“任何东西”,范围从快速枚举,元组,封闭,结构,类,协议,不管。每种类型都可以分配给Any类型的变量。

Hashable是表示“该对象可以散列,即具有散列码”的协议。如果你的对象可以被散列,那么实现这个协议,因为很多数据结构(即字典和集合)都需要它。

那么什么是AnyHashable

通常情况下,如果你尝试这样做:

let a: Set<Hashable>? 

它不会编译。这是因为Hashable继承自Equatable,其中包含Self

现在,假设您想将Objective-C中的方法移植到swift中。该方法采用NSSet类型的参数。在Swift中,这将变成Set,但其通用参数是什么?如果我们只是像s那样放Any,它不起作用,因为Set的对象必须是可散列的。但是如果我们把Set<Hashable>它不起作用,或者因为Hashable只能用作通用约束。这就是为什么他们用AnyHashable包装Hashable使用Self,所以可以用作通用参数。

关于什么是“删除类型”是指:

在协议有Self是一种像一个泛型参数的协议,和通用参数始终是符合的类。这会导致协议无法像Set<Hashable>一样单独使用,因为“通用参数”未知。 AnyHashable通过完全不使用Self解决了这个问题,所以它现在变成了一个普通的结构。它“擦除”通用Self类型。

+0

一切都明白了,除了'类型擦除'的术语,我试图理解它。 – technerd

+0

你对'擦除类型'有什么不了解? @technerd – Sweeper

+0

老实说,类型擦除对我来说似乎很奇怪。我试图从这个例子中了解.https://www.natashatherobot.com/swift-type-erasure/ – technerd

相关问题