繁体   English   中英

Swift 3中Any,Hashable,AnyHashable有什么区别?

[英]What is difference between Any , Hashable , AnyHashable in Swift 3?

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

为什么Swift会推出AnyHashable

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

AnyAnyHashable之间的AnyHashable

HashableAnyHashable之间的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只能用作通用约束。 这就是为什么他们用使用SelfAnyHashable包装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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM