簡體   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