我不明白什麼時候使用AnyObject以及什麼時候在Swift中使用Any。AnyObject和任何在Swift中
我的情況下,我有一個字典
[字符串:???]
??? :可以是Int,Double,Float,String,Array,Dictionary
有人可以解釋Any和AnyObject之間的區別 和女巫在我的情況下使用。
奧洛克
我不明白什麼時候使用AnyObject以及什麼時候在Swift中使用Any。AnyObject和任何在Swift中
我的情況下,我有一個字典
[字符串:???]
??? :可以是Int,Double,Float,String,Array,Dictionary
有人可以解釋Any和AnyObject之間的區別 和女巫在我的情況下使用。
奧洛克
AnyObject
僅適用於參考類型(類),Any
適用於值類型和參考類型。所以你應該去[String: Any]
。
對於任何類型的連鑄AnyObject
夫特提供了兩種特殊類型與非特異性類型的工作:
Any
可以在所有代表任何類型的實例,包括函數 類型。AnyObject
可以表示任何類類型的實例。注:
使用
Any
和AnyObject
只有當你明確需要的行爲和 能力,他們提供的。在你的代碼中使用你期望使用的類型總是更好的。
-
還要注意的是,當你與可可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
。
無論您使用Any
或AnyObject
取決於你的使用目的:
如果你的字典裏將只在斯威夫特的代碼中使用,那麼你應該使用Any
,因爲你的類型(Int
,Double
,Float
,String
,Array
和Dictionary
)不是對象。
如果您將字典傳遞到期望NSDictionary
的Objective-C例程,那麼您應該使用AnyObject
。
當你import Foundation
或import UIKit
或import Cocoa
,有可能來聲明數組作爲[String: AnyObject]
,但在這種情況下,斯威夫特處理您的Int
,Double
,Float
文字爲NSNumber
,你String
S作爲NSString
,你Array
S作爲NSArray
,和你的字典NSDictionary
,所有這些都是對象。使用AnyObject
作爲值類型的字典可轉換爲NSDictionary
,但使用Any
的字典不是。
泛型是類型安全的,如果你傳遞一個字符串作爲一個通用的,並嘗試爲整數,編譯器會使用這意味着,你將無法編譯(這是很好)。 (這是因爲Swift使用靜態類型,並能夠給你一個編譯器錯誤)
如果你使用AnyObject編譯器不知道這個對象可以被視爲一個字符串或作爲一個整數,基本上會允許你做任何你想做的事情(這是壞的),就好像你嘗試使用一個已經作爲字符串傳遞的對象,當它是一個整數時,應用程序將會崩潰。 (這是因爲斯威夫特使用動態打字,只會給你一個運行時錯誤)
注意'String','Array'和'Dictionary'不是類,對於這些使用的任何。 – zaph 2014-09-12 13:33:19
也不是Int,Double和Float。 – Teejay 2014-09-12 13:35:49
是的,但通常很明顯。 NSString,NSArray和NSDictionary都不是很明顯,但類似功能的Swift版本不是類,而是讓許多開發人員絆倒。 – zaph 2014-09-12 13:42:00