簡單解釋 Any 與 AnyObject 的差別 讓你快速掌握這兩個概念!


本篇原文(標題:Any & AnyObject in iOS)刊登於作者 Medium,由 Nitin Aggarwal 所著,並授權翻譯及轉載。

每次編寫程式碼時,我們都會處理實例 (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 吧:

any-demo

以上是 Swift 中 Any 的範例。在這個範例中,我們利用型別檢查 (type-checking) ‘is’ 關鍵字,來檢查所有值的型別。

然後,讓我們來看看 AnyObject:

anyobject-demo

看看上面的範例,請注意建​​議行寫著 “The protocol to which all classes implicitly confirm”,也就是說所有類別都隱式遵從 AnyObject 協定。

當你需要無型別物件的靈活性時,又或是當你使用橋接的 Objective-C方法及返回無型別結果的屬性時,你就會使用 AnyObjectAnyObject 可以用作任何類別、類別型別、或 class-only 協定的實例的具體型別。

在上面的範例中,你可以看到我們不能將 Int、String、或任何其他型別用作 AnyObject。

AnyObject 協定的靈活度與 Objective-C 的 id 型別類似。因此,匯入的 Objective-C 型別經常使用 AnyObject,來作為屬性、方法參數、和返回值的型別。

AnyObject 協定也可以幫助我們彌合 Swift 和 Objective-C 之間的差距。

如何選擇使用 Any 或 AnyObject?

我建議在你處理參考型別時使用 AnyObject,而在處理數值型別 (value type) 時使用 Any。

不過請注意,可以的話,我們應盡量避免使用 Any 和 AnyObject,畢竟具體一點比較好。

如果有任何問題,歡迎在下面留言。希望你喜歡這篇文章。

本篇原文(標題:Any&AnyObject in iOS)刊登於作者 Medium,由 Nitin Aggarwal 所著,並授權翻譯及轉載。

作者簡介:Nitin Aggarwal,一位有創意、愛學習的 iOS 開發者,專注於 Swift 與 Objective-C 語言,也喜歡寫文章。歡迎電郵至 [email protected] 聯絡我。

譯者簡介:Kelly Chan-AppCoda 編輯小姐。


此文章為客座或轉載文章,由作者授權刊登,AppCoda編輯團隊編輯。有關文章詳情,請參考文首或文末的簡介。

blog comments powered by Disqus
Shares
Share This