我不明白什么时候使用AnyObject以及什么时候在Swift中使用Any。AnyObject和任何在Swift中
我的情况下,我有一个字典
[字符串:???]
??? :可以是Int,Double,Float,String,Array,Dictionary
有人可以解释Any和AnyObject之间的区别 和女巫在我的情况下使用。
奥洛克
我不明白什么时候使用AnyObject以及什么时候在Swift中使用Any。AnyObject和任何在Swift中
我的情况下,我有一个字典
[字符串:???]
??? :可以是Int,Double,Float,String,Array,Dictionary
有人可以解释Any和AnyObject之间的区别 和女巫在我的情况下使用。
奥洛克
AnyObject
仅适用于参考类型(类),Any
适用于值类型和参考类型。所以你应该去[String: Any]
。
对于任何类型的连铸AnyObject
夫特提供了两种特殊类型与非特异性类型的工作:
Any
可以在所有代表任何类型的实例,包括函数 类型。AnyObject
可以表示任何类类型的实例。注:
使用
Any
和AnyObject
只有当你明确需要的行为和 能力,他们提供的。在你的代码中使用你期望使用的类型总是更好的。
-
还要注意的是,当你与可可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
。
无论您使用Any
或AnyObject
取决于你的使用目的:
如果你的字典里将只在斯威夫特的代码中使用,那么你应该使用Any
,因为你的类型(Int
,Double
,Float
,String
,Array
和Dictionary
)不是对象。
如果您将字典传递到期望NSDictionary
的Objective-C例程,那么您应该使用AnyObject
。
当你import Foundation
或import UIKit
或import Cocoa
,有可能来声明数组作为[String: AnyObject]
,但在这种情况下,斯威夫特处理您的Int
,Double
,Float
文字为NSNumber
,你String
S作为NSString
,你Array
S作为NSArray
,和你的字典NSDictionary
,所有这些都是对象。使用AnyObject
作为值类型的字典可转换为NSDictionary
,但使用Any
的字典不是。
泛型是类型安全的,如果你传递一个字符串作为一个通用的,并尝试为整数,编译器会使用这意味着,你将无法编译(这是很好)。 (这是因为Swift使用静态类型,并能够给你一个编译器错误)
如果你使用AnyObject编译器不知道这个对象可以被视为一个字符串或作为一个整数,基本上会允许你做任何你想做的事情(这是坏的),就好像你尝试使用一个已经作为字符串传递的对象,当它是一个整数时,应用程序将会崩溃。 (这是因为斯威夫特使用动态打字,只会给你一个运行时错误)
注意'String','Array'和'Dictionary'不是类,对于这些使用的任何。 – zaph 2014-09-12 13:33:19
也不是Int,Double和Float。 – Teejay 2014-09-12 13:35:49
是的,但通常很明显。 NSString,NSArray和NSDictionary都不是很明显,但类似功能的Swift版本不是类,而是让许多开发人员绊倒。 – zaph 2014-09-12 13:42:00