ios - Swift 3 中的 Any 、 Hashable 、 AnyHashable 有什么区别?

标签 ios swift swift3 associated-types hashable

我通过大量教程摸索着理解上述 3 个术语之间的区别,并找到了新术语 type erased container,现在它让我感到困惑。这引发了很多问题。

为什么 Swift 引入 AnyHashable

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

AnyAnyHashable 的区别?

HashableAnyHashable 的区别?

什么时候使用Hashable,什么时候使用AnyHashable

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

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

最佳答案

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

Any意思是“任何东西”,范围从 swift 枚举、元组、闭包、结构、类、协议(protocol)等等。每种类型都可以分配给类型为 Any 的变量.

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

那么 AnyHashable 是什么? ?

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

let a: Set<Hashable>?

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

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

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

拥有Self在协议(protocol)中是一种 like a protocol with a generic parameter ,并且泛型参数始终是符合类。这导致协议(protocol)无法单独使用,如 Set<Hashable>因为“通用参数”是未知的。 AnyHashable通过不使用 Self 解决了这个问题所以它现在变成了一个普通的结构。它“删除”通用 Self类型。

关于ios - Swift 3 中的 Any 、 Hashable 、 AnyHashable 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44513675/

相关文章:

ios - 用户键入时更改 UILabel 文本颜色

ios - MapView 中的 AnnotationView 具有从 mysql 数据库检索到的不同图像

ios - 警报 Controller 内多个文本字段的空文本验证

swift - 为什么选择自动关闭而不是字符串文字?

ios - GameCenter - 在调用处理程序之前检查以前的登录?

ios - 使用 Swift 使用键盘向上移动 TextView

objective-c - 通过引用 ObjectiveC 方法快速传递数组

ios - Firebase 链接器错误 XCode 8 beta 2

arrays - 如何使用另一个类的变量打印一个类的元素?

javascript - 检索设备信息 React-Native iOS