AnyObject和任何在Swift中

我不明白什么时候使用AnyObject,什么时候在Swift中用户Any。

我的情况,我有一个词典

[string:???]

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

有人可以向我解释Any和AnyObject之间的区别,在我的情况下可以使用一个。

奥洛克

AnyObject仅用于引用types(类), Any用于值和引用types。

所以你应该去[String: Any]

为Any和AnyObjecttypes转换

Swift提供了两种特殊types来处理非特定types:

  • Any可以表示任何types的实例,包括函数types。
  • AnyObject可以表示任何类types的实例。

注意:

只有当你明确需要他们提供的行为和function时才使用AnyAnyObject 。 对于你期望在你的代码中使用的types来说,总是比较好的。

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

另外请注意,当您使用Cocoa API时,通常会收到一个AnyObject数组,这是因为Objective-C数组不是典型的。 所以你需要将它们转换为你期望的数组types。

编辑:( 2015年12月22日)
在最后的声明中,请注意,Swift 2.0和Xcode 7将会改变这一点。
苹果已经在Objective-C中引入了“轻量级”generics ,现在大量的Cocoa API已经返回了正确的types。

编辑:( 2016年10月18日)
请注意,从Swift 3.0开始,Objective-C id现在被导入为Any ,而不再是AnyObject

无论您使用AnyAnyObject取决于您的预期用途:

如果你的字典只能在Swift代码中使用,那么你应该使用Any因为你的types( IntDoubleFloatStringArrayDictionary )不是对象。

如果您将字典传递给需要NSDictionary Objective-C例程,则应该使用AnyObject

当你import Foundationimport UIKitimport Cocoa ,可以将数组声明为[String: AnyObject] ,但在这种情况下,Swift将你的IntDoubleFloat文字视为NSNumber ,将你的String视为NSString ,作为NSArray ,你的字典作为NSDictionary ,所有这些都是对象。 使用AnyObject作为值types的NSDictionary可转换为NSDictionary ,但是使用Any NSDictionary不是。

generics是types安全的,这意味着如果你传递一个string作为一个通用的,并尝试使用整数编译器会抱怨,你将无法编译你的(这是好的)。 (这是因为Swift使用静态types,并能够给你一个编译器错误)

如果你使用AnyObject,编译器不知道这个对象可以被当作一个String或者一个Integer,并且基本上可以让你做任何你想要的东西(这是坏的),就像你试图使用一个已经当它是一个整数时,作为string传递,应用程序将崩溃。 (这是因为Swift使用dynamictypes,只会给你一个运行时错误)