2014-09-12 70 views
63

我不明白什么时候使用AnyObject以及什么时候在Swift中使用Any。AnyObject和任何在Swift中

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

[字符串:???]

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

有人可以解释Any和AnyObject之间的区别 和女巫在我的情况下使用。

奥洛克

回答

76

AnyObject仅适用于参考类型(类),Any适用于值类型和参考类型。所以你应该去[String: Any]

对于任何类型的连铸AnyObject

夫特提供了两种特殊类型与非特异性类型的工作:

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

注:

使用AnyAnyObject只有当你明确需要的行为和 能力,他们提供的。在你的代码中使用你期望使用的类型总是更好的。

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

-

还要注意的是,当你与可可API的工作,这是常见的接收AnyObject的数组,这是因为Objective-C的数组不是典型的。 所以你需要将它们转换为你期望的数组类型。

-

编辑:(2015年12月22日)
在最后陈述时,请注意,这是与雨燕2.0和Xcode的7
苹果已经在Objective-C所以很多介绍‘Lightweight’ generics改变可可API现在已经返回了正确的类型。

编辑:(2016年10月18日)
。注意,作为夫特3.0,Objective-C的id s的现在导入为Any,不再作为AnyObject

+11

注意'String','Array'和'Dictionary'不是类,对于这些使用的任何。 – zaph 2014-09-12 13:33:19

+3

也不是Int,Double和Float。 – Teejay 2014-09-12 13:35:49

+8

是的,但通常很明显。 NSString,NSArray和NSDictionary都不是很明显,但类似功能的Swift版本不是类,而是让许多开发人员绊倒。 – zaph 2014-09-12 13:42:00

29

无论您使用AnyAnyObject取决于你的使用目的:

如果你的字典里将只在斯威夫特的代码中使用,那么你应该使用Any,因为你的类型(IntDoubleFloatStringArrayDictionary)不是对象。

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

当你import Foundationimport UIKitimport Cocoa,有可能来声明数组作为[String: AnyObject],但在这种情况下,斯威夫特处理您的IntDoubleFloat文字为NSNumber,你String S作为NSString,你Array S作为NSArray ,和你的字典NSDictionary,所有这些都是对象。使用AnyObject作为值类型的字典可转换为NSDictionary,但使用Any的字典不是。

0

泛型是类型安全的,如果你传递一个字符串作为一个通用的,并尝试为整数,编译器会使用这意味着,你将无法编译(这是很好)。 (这是因为Swift使用静态类型,并能够给你一个编译器错误)

如果你使用AnyObject编译器不知道这个对象可以被视为一个字符串或作为一个整数,基本上会允许你做任何你想做的事情(这是坏的),就好像你尝试使用一个已经作为字符串传递的对象,当它是一个整数时,应用程序将会崩溃。 (这是因为斯威夫特使用动态打字,只会给你一个运行时错误)

相关问题