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,只会给你一个运行时错误)