Swift中的AnyObject和Any


91

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

就我而言,我有字典

[字串:???]

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

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

阿拉克

Answers:


114

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

所以你应该去[String: Any]

类型转换为Any和AnyObject

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

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

注意:

使用AnyAnyObject只有当你明确需要的行为和能力,他们提供的。最好对要在代码中使用的类型进行具体说明。

雨燕编程语言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起,id现在将Objective-C 导入为Any,而不再是AnyObject


18
请注意StringArrayDictionary不是类,因为它们使用Any。
zaph 2014年

6
也没有Int,Double和Float。
Teejay 2014年

11
是的,但这通常很明显。并不是很明显NSStringNSArrayNSDictionary是类,而功能相似的Swift版本不是类,这会绊倒许多开发人员。
zaph 2014年

1
是否也代表可选项?还是应该将其表示为“任何”?

1
@robdashnash任何不代表可选。?应该添加以使其可选
crypt

46

是否使用AnyAnyObject取决于预期用途:

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

如果要将字典传递给期望为的Objective-C例程,NSDictionary则应使用AnyObject

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



1

检查这个SO答案

泛型是类型安全的,这意味着如果您将字符串作为泛型传递并尝试将其用作整数,则编译器将抱怨并且您将无法编译您的(很好)。(发生这种情况是因为Swift使用静态类型,并且能够给您一个编译器错误)。如果您使用AnyObject,则编译器不知道该对象可以视为String或Integer,并且基本上可以让您对它做任何想做的事情(这很糟糕),就像您尝试使用一个已经存在的对象一样。如果它是整数,则作为字符串传递,应用程序将崩溃。(发生这种情况是因为Swift正在使用动态类型输入,只会给您一个运行时错误)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.