每次編寫程式碼時,我們都會處理實例 (instance) 或類型 (type)。在非特定型別的情況下,我們會選擇 Any 或 AnyObject。
Any 和 AnyObject 的差別
Any:它可以代表任何型別的類別 (class)、結構 (struct)、列舉 (enum),包括函式和可選型別,基本上可以說是任何東西。
AnyObject:它指的是類別的任何實例。這只在使用參考型別 (reference type) 時,才能派上用場。這就相等於 Objective-C 中等的 ‘id’。
如果你的字典只會在 Swift 程式碼中使用,你就應該使用 Any,因為你的型別 (Int、Double、Float、String、Array、和 Dictionary) 不是物件 (object)。
而如果你會將字典傳遞給需要 NSDictionary 的 Objective-C 程式碼,就應該使用AnyObject。
讓我們來了解一下 Any 吧:
以上是 Swift 中 Any 的範例。在這個範例中,我們利用型別檢查 (type-checking) ‘is’ 關鍵字,來檢查所有值的型別。
然後,讓我們來看看 AnyObject:
看看上面的範例,請注意建議行寫著 “The protocol to which all classes implicitly confirm”,也就是說所有類別都隱式遵從 AnyObject 協定。
當你需要無型別物件的靈活性時,又或是當你使用橋接的 Objective-C方法及返回無型別結果的屬性時,你就會使用 AnyObject
。AnyObject
可以用作任何類別、類別型別、或 class-only 協定的實例的具體型別。
在上面的範例中,你可以看到我們不能將 Int、String、或任何其他型別用作 AnyObject。
AnyObject
協定的靈活度與 Objective-C 的 id
型別類似。因此,匯入的 Objective-C 型別經常使用 AnyObject
,來作為屬性、方法參數、和返回值的型別。
AnyObject
協定也可以幫助我們彌合 Swift 和 Objective-C 之間的差距。
如何選擇使用 Any 或 AnyObject?
我建議在你處理參考型別時使用 AnyObject,而在處理數值型別 (value type) 時使用 Any。
不過請注意,可以的話,我們應盡量避免使用 Any 和 AnyObject,畢竟具體一點比較好。
如果有任何問題,歡迎在下面留言。希望你喜歡這篇文章。