![](/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.