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时才使用
Any和AnyObject。 对于你期望在你的代码中使用的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 。 
 无论您使用Any或AnyObject取决于您的预期用途: 
 如果你的字典只能在Swift代码中使用,那么你应该使用Any因为你的types( Int , Double , Float , String , Array和Dictionary )不是对象。 
 如果您将字典传递给需要NSDictionary Objective-C例程,则应该使用AnyObject 。 
 当你import Foundation或import UIKit或import Cocoa ,可以将数组声明为[String: AnyObject] ,但在这种情况下,Swift将你的Int , Double , Float文字视为NSNumber ,将你的String视为NSString ,作为NSArray ,你的字典作为NSDictionary ,所有这些都是对象。 使用AnyObject作为值types的NSDictionary可转换为NSDictionary ,但是使用Any NSDictionary不是。 
generics是types安全的,这意味着如果你传递一个string作为一个通用的,并尝试使用整数编译器会抱怨,你将无法编译你的(这是好的)。 (这是因为Swift使用静态types,并能够给你一个编译器错误)
如果你使用AnyObject,编译器不知道这个对象可以被当作一个String或者一个Integer,并且基本上可以让你做任何你想要的东西(这是坏的),就像你试图使用一个已经当它是一个整数时,作为string传递,应用程序将崩溃。 (这是因为Swift使用dynamictypes,只会给你一个运行时错误)