21

我通过大量教程摸索以了解上述 3 个术语之间的区别并找到新的术语type erased容器,现在它让我感到困惑。它提出了很多问题。

为什么要引入 Swift AnyHashable

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

Any和之间的区别AnyHashable

Hashable和之间的区别AnyHashable

何时使用Hashable,何时使用AnyHashable

type erased最后但最令人困惑的是,术语在上下文中的含义是AnyHashable什么?

作为上下文,我遵循了Swift Evolution Proposal SE-0131

4

1 回答 1

17

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

Any表示“任何东西”,范围从快速枚举、元组、闭包、结构、类、协议等等。每种类型都可以分配给 type 的变量Any

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

那么是什么AnyHashable

通常,如果您尝试这样做:

let a: Set<Hashable>?

它不编译。这是因为Hashable继承自Equatablewhich contains Self

现在,假设您想将一个方法从 Objective-C 移植到 swift。该方法采用 type 的参数NSSet。在 Swift 中,这会变成Set,但它的泛型参数是什么?如果我们Any像使用NSArrays 一样放置,它不起作用,因为Set' 对象必须是可散列的。但是如果我们把Set<Hashable>它也不起作用,因为Hashable只能用作通用约束。这就是为什么它们用不使用的包裹起来Hashable因此可以AnyHashable用作通用参数。Self

关于“类型擦除”的含义:

包含在Self协议中有点像带有泛型参数的协议,而泛型参数始终是符合标准的类。这会导致协议无法单独使用,Set<Hashable>因为“通用参数”是未知的。AnyHashable通过根本不使用来解决这个问题,Self所以它现在变成了一个普通的结构。它“擦除”泛型Self类型。

于 2017-06-13T06:30:19.827 回答