2017-06-13 87 views
11

我通過大量的教程來了解我的頭,以瞭解上述3個術語之間的區別,並找到新術語type erased容器,現在它變得讓我感到困惑。它引發了很多問題。Swift 3中Any,Hashable,AnyHashable之間有什麼區別?

爲什麼斯威夫特推出AnyHashable

這3個術語之間的根本區別是什麼?

AnyAnyHashable之間的區別?

HashableAnyHashable之間的區別?

何時使用Hashable以及何時AnyHashable

最後但卻最令人困惑的是,type erased術語的含義是什麼AnyHashable?我跟着Swift Evolution Proposal SE-0131

+0

看到這一次https://stackoverflow.com/questions/39382852/didreceiveremotenotification-not-called-ios-10/39383027#39383027 –

回答

8

瞭解它們比什麼是它們之間的區別更重要。

Any的意思是「任何東西」,範圍從快速枚舉,元組,封閉,結構,類,協議,不管。每種類型都可以分配給Any類型的變量。

Hashable是表示「該對象可以散列,即具有散列碼」的協議。如果你的對象可以被散列,那麼實現這個協議,因爲很多數據結構(即字典和集合)都需要它。

那麼什麼是AnyHashable

通常情況下,如果你嘗試這樣做:

let a: Set<Hashable>? 

它不會編譯。這是因爲Hashable繼承自Equatable,其中包含Self

現在,假設您想將Objective-C中的方法移植到swift中。該方法採用NSSet類型的參數。在Swift中,這將變成Set,但其通用參數是什麼?如果我們只是像s那樣放Any,它不起作用,因爲Set的對象必須是可散列的。但是如果我們把Set<Hashable>它不起作用,或者因爲Hashable只能用作通用約束。這就是爲什麼他們用AnyHashable包裝Hashable使用Self,所以可以用作通用參數。

關於什麼是「刪除類型」是指:

在協議有Self是一種像一個泛型參數的協議,和通用參數始終是符合的類。這會導致協議無法像Set<Hashable>一樣單獨使用,因爲「通用參數」未知。 AnyHashable通過完全不使用Self解決了這個問題,所以它現在變成了一個普通的結構。它「擦除」通用Self類型。

+0

一切都明白了,除了'類型擦除'的術語,我試圖理解它。 – technerd

+0

你對'擦除類型'有什麼不瞭解? @technerd – Sweeper

+0

老實說,類型擦除對我來說似乎很奇怪。我試圖從這個例子中瞭解.https://www.natashatherobot.com/swift-type-erasure/ – technerd

相關問題