Swift中Any、AnyHashable、AnyObject、AnyClass區別

anchor_發表於2019-02-14

概覽

Any是一個空協議集合的別名,它表示沒有實現任何協議,因此它可以是任何型別,包括類例項與結構體例項,以及函式型別和可選型別。 AnyHashable遵守Hashable協議的Any型別,是Any的子集合,主要用於Dictionary和Set中。 AnyObject是一個成員為空的協議,任何物件都實現了這個協議。它是Any的子集合,Any中的類例項。 AnyClass是AnyObject.Type的別名而已。

具體來說

1.AnyObject

本身就是一個介面,而且所有的class都隱式的實現了這個介面,這也限制了AnyObject是隻適用於Class型別的原因。

AnyObject有什麼用呢?

有過Objective-C開發經驗的人肯定知道id, 它可以表示任意類的例項, 編譯器不會對向宣告為 id 的變數進行型別檢查.而 Swift為了與 Cocoa 架構進行協作開發,就將原來的id用 AnyObject 來進行替代。

2.Any

既然AnyObject是隻適用於Class型別 ,那swift中的所有基本型別怎麼辦,這個時候呢Any就幫上忙了

Any不僅僅能夠容括class型別 ,說得更直白一點, 就是所有的型別都可以用Any表示, 包括基本資料型別, enum, struct, func(方法)等等.

3.AnyClass

屬於AnyObject.Type的別名:typealias AnyClass = AnyObject .Type 表示任意類的元型別,任意類的型別都隱式遵守這個協議.

4. AnyHashable

Swift的Any型別可以儲存任何型別,但是Dictionary和Set需要的鍵的型別是要求遵守Hashable協議的型別,所以Any表示的太廣泛。 從Swift 3開始,Swift標準庫提供了一個新的型別AnyHashable。 與Any類似,它充當所有Hashable型別的父類,因此String、Int和其他hashable型別的值都可以隱式地用作AnyHashable值,AnyHashable型別的值可以使用is、as !動態檢查或者使用as?動態轉換運算子。

相關文章