2014-09-12 64 views
63

我不明白什麼時候使用AnyObject以及什麼時候在Swift中使用Any。AnyObject和任何在Swift中

我的情況下,我有一個字典

[字符串:???]

??? :可以是Int,Double,Float,String,Array,Dictionary

有人可以解釋Any和AnyObject之間的區別 和女巫在我的情況下使用。

奧洛克

回答

76

AnyObject僅適用於參考類型(類),Any適用於值類型和參考類型。所以你應該去[String: Any]

對於任何類型的連鑄AnyObject

夫特提供了兩種特殊類型與非特異性類型的工作:

  • Any可以在所有代表任何類型的實例,包括函數 類型。
  • AnyObject可以表示任何類類型的實例。

注:

使用AnyAnyObject只有當你明確需要的行爲和 能力,他們提供的。在你的代碼中使用你期望使用的類型總是更好的。

雨燕編程語言https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID342

-

還要注意的是,當你與可可API的工作,這是常見的接收AnyObject的數組,這是因爲Objective-C的數組不是典型的。 所以你需要將它們轉換爲你期望的數組類型。

-

編輯:(2015年12月22日)
在最後陳述時,請注意,這是與雨燕2.0和Xcode的7
蘋果已經在Objective-C所以很多介紹‘Lightweight’ generics改變可可API現在已經返回了正確的類型。

編輯:(2016年10月18日)
。注意,作爲夫特3.0,Objective-C的id s的現在導入爲Any,不再作爲AnyObject

+11

注意'String','Array'和'Dictionary'不是類,對於這些使用的任何。 – zaph 2014-09-12 13:33:19

+3

也不是Int,Double和Float。 – Teejay 2014-09-12 13:35:49

+8

是的,但通常很明顯。 NSString,NSArray和NSDictionary都不是很明顯,但類似功能的Swift版本不是類,而是讓許多開發人員絆倒。 – zaph 2014-09-12 13:42:00

29

無論您使用AnyAnyObject取決於你的使用目的:

如果你的字典裏將只在斯威夫特的代碼中使用,那麼你應該使用Any,因爲你的類型(IntDoubleFloatStringArrayDictionary)不是對象。

如果您將字典傳遞到期望NSDictionary的Objective-C例程,那麼您應該使用AnyObject

當你import Foundationimport UIKitimport Cocoa,有可能來聲明數組作爲[String: AnyObject],但在這種情況下,斯威夫特處理您的IntDoubleFloat文字爲NSNumber,你String S作爲NSString,你Array S作爲NSArray ,和你的字典NSDictionary,所有這些都是對象。使用AnyObject作爲值類型的字典可轉換爲NSDictionary,但使用Any的字典不是。

0

泛型是類型安全的,如果你傳遞一個字符串作爲一個通用的,並嘗試爲整數,編譯器會使用這意味着,你將無法編譯(這是很好)。 (這是因爲Swift使用靜態類型,並能夠給你一個編譯器錯誤)

如果你使用AnyObject編譯器不知道這個對象可以被視爲一個字符串或作爲一個整數,基本上會允許你做任何你想做的事情(這是壞的),就好像你嘗試使用一個已經作爲字符串傳遞的對象,當它是一個整數時,應用程序將會崩潰。 (這是因爲斯威夫特使用動態打字,只會給你一個運行時錯誤)

相關問題