- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我通过大量教程摸索着理解上述 3 个术语之间的区别,并找到了新术语 type erased
container,现在它让我感到困惑。这引发了很多问题。
为什么 Swift 引入 AnyHashable
?
这 3 个术语之间的根本区别是什么?
Any
和 AnyHashable
的区别?
Hashable
和 AnyHashable
的区别?
什么时候使用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/
我是一名优秀的程序员,十分优秀!