![](/img/trans.png)
[英]How can I cast an array of [AnyObject] to an array of [Hashable] or [AnyHashable] in Swift?
[英]What is difference between Any , Hashable , AnyHashable in Swift 3?
我通过大量的教程来理解上述3个术语之间的区别并找到新的术语type erased
容器,现在它让我感到困惑。 这提出了很多问题。
为什么Swift会推出AnyHashable
?
这3个术语之间的根本区别是什么?
Any
和AnyHashable
之间的AnyHashable
?
Hashable
和AnyHashable
之间的AnyHashable
?
何时使用Hashable
以及何时使用AnyHashable
?
最后但最令人困惑的是,在AnyHashable
的上下文中type erased
术语的含义是什么?
作为背景,我遵循了Swift Evolution Proposal SE-0131 。
了解它们的含义比它们之间的差异更重要。
Any
意思是“任何东西”,包括快速枚举,元组,闭包,结构,类,协议等等。 可以将每种类型分配给Any
类型的变量。
Hashable
是一种协议,表示“此对象可以进行哈希处理,即具有哈希码”。 如果您的对象可以进行哈希处理,请实现此协议,因为需要大量数据结构(即字典和集合)。
那么什么是AnyHashable
?
通常,如果您尝试这样做:
let a: Set<Hashable>?
它没有编译。 这是因为Hashable
继承自包含Self
Equatable
。
现在,假设您想要将一个方法从Objective-C移植到swift。 该方法采用NSSet
类型的参数。 在Swift中,这将变成一个Set
,但它的通用参数是什么? 如果我们像使用NSArray
一样放置Any
,它就不起作用,因为Set
的对象必须是可清除的。 但是如果我们把Set<Hashable>
它也不起作用,因为Hashable
只能用作通用约束。 这就是为什么他们用不使用Self
的AnyHashable
包装Hashable
,因此可以用作通用参数。
关于什么“类型擦除”意味着:
在协议中使用Self
有点像具有泛型参数的协议 ,而泛型参数始终是符合要求的类。 这导致协议无法像Set<Hashable>
一样独立使用,因为“泛型参数”未知。 AnyHashable
通过不使用Self
来解决这个问题,所以它现在变成了一个普通的struct。 它“擦除”通用Self
类型。
Any
可以表示任何类型的实例,包括函数类型。 它告诉我们Any
的含义比AnyObject
更宽泛。 任何都可以代表任何名称。
尽管Any
可以表示任何类型的实例,但它有其局限性。 您可能知道Set
的元素和Dictionary
的键需要是可以清除的。 它们需要符合Hashable
协议。 集合需要能够唯一地标识它包含的每个元素。 要查找与给定键关联的值,字典需要其键是唯一的。 问题是Any
不符合此要求。
从Swift 3
,Swift标准库定义了AnyHashable
超类型。 这意味着符合Hashable
协议的类型可以用作AnyHashable
。 在Swift标准库中, AnyHashable
被定义为结构。
public struct AnyHashable {
public init<H>(_ base: H) where H : Hashable
public var base: Any { get }
}
AnyHashable
超类型用于将无类型集和字典从Objective-C
引入Swift
。
在这里阅读更多
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.