【问题标题】:What is difference between Any , Hashable , AnyHashable in Swift 3?Swift 3 中 Any 、 Hashable 、 AnyHashable 有什么区别?
【发布时间】:2017-11-14 18:29:10
【问题描述】:

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

为什么 Swift 会引入AnyHashable

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

AnyAnyHashable 之间的区别?

HashableAnyHashable 之间的区别?

何时使用Hashable,何时使用AnyHashable

最后但最令人困惑的是,type erasedAnyHashable 的上下文中的含义是什么?

作为上下文,我关注了Swift Evolution Proposal SE-0131

【问题讨论】:

标签: ios swift swift3 associated-types hashable


【解决方案1】:

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

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

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

那么AnyHashable是什么?

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

let a: Set<Hashable>?

它不会编译。这是因为Hashable 继承自包含SelfEquatable

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

关于“类型擦除”是什么意思:

在协议中有Self 有点像like a protocol with a generic parameter,通用参数总是符合的类。这会导致协议无法像Set&lt;Hashable&gt; 那样单独使用,因为“通用参数”是未知的。 AnyHashable 完全不使用 Self 解决了这个问题,所以它现在变成了一个普通的结构。它“擦除”了通用的Self 类型。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-10-19
  • 2018-02-27
  • 2019-06-07
  • 1970-01-01
  • 2015-07-12
  • 2019-11-19
  • 2022-12-03
  • 2020-05-10
相关资源
最近更新 更多