Swift中的AnyObject和Any

Ala*_*lak 87 value-type reference-type swift

我不明白何时使用AnyObject以及何时在Swift中使用Any.

在我的情况下,我有一个字典

[String:???]

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

有人可以解释我和AnyObject之间的区别,以及在我的情况下使用哪一个.

奥洛克

Tee*_*jay 107

AnyObject仅适用于引用类型(类),Any适用于值和引用类型.

所以你应该去[String: Any].

为Any和AnyObject键入Casting

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

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

注意:

使用AnyAnyObject只有当你明确需要的行为以及它们提供的功能.最好具体了解您希望在代码中使用的类型.

来自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数组不是典型的.所以你需要将它们转换为你期望的数组类型.

-

编辑:( 2015
年12月22日)在最后一个声明中,请注意,Swift 2.0和Xcode 7正在发生变化
.Apple已经在Objective-C中引入了"轻量级"泛型,因此许多Cocoa API现在已经返回了正确的类型.

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

  • 注意`String`,`Array`和`Dictionary`不是类,因为它们使用Any. (16认同)
  • 是的,但这通常很明显.不太明显的是`NSString`,`NSArray`和`NSDictionary`是类,但类似功能的Swift版本不是类,并且它会绊倒许多开发人员. (10认同)
  • Nor Int,Double和Float都是. (6认同)
  • @robdashnash Any 不代表可选。?应该添加以使其可选 (2认同)

vac*_*ama 45

无论您使用Any还是AnyObject取决于您的预期用途:

如果你的字典将仅限于雨燕的代码中使用,那么就应该使用Any,因为你的类型(Int,Double,Float,String,Array,和Dictionary)不是对象.

如果您将字典传递给期望的Objective-C例程NSDictionary,那么您应该使用AnyObject.

当您import Foundationimport UIKit或者import Cocoa,也可以来声明数组[String: AnyObject],但在这种情况下,斯威夫特对待你Int,Double,Float文字的NSNumber,你StringS作为NSString,你ArrayS作为NSArray,你的字典如NSDictionary,所有这一切都是对象.使用AnyObject作为值类型的字典可以转换为NSDictionary,但是使用的字典Any不是.