我不明白何时在Swift中使用AnyObject以及何时使用Any。
就我而言,我有字典
[字串:???]
??? :可以是Int,Double,Float,String,Array,Dictionary
有人可以向我解释Any和AnyObject之间的区别以及在我的情况下使用哪一个。
阿拉克
Answers:
AnyObject
仅适用于引用类型(类),Any
适用于值和引用类型。
所以你应该去[String: Any]
。
类型转换为Any和AnyObject
Swift提供两种特殊类型来处理非特定类型:
Any
可以代表任何类型的实例,包括函数类型。AnyObject
可以代表任何类类型的实例。注意:
使用
Any
和AnyObject
只有当你明确需要的行为和能力,他们提供的。最好对要在代码中使用的类型进行具体说明。
--
还要注意,当您使用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
。
NSString
,NSArray
和NSDictionary
是类,而功能相似的Swift版本不是类,这会绊倒许多开发人员。
是否使用Any
或AnyObject
取决于预期用途:
如果你的字典将仅限于雨燕的代码中使用,那么就应该使用Any
,因为你的类型(Int
,Double
,Float
,String
,Array
,和Dictionary
)不是对象。
如果要将字典传递给期望为的Objective-C例程,NSDictionary
则应使用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或Integer,并且基本上可以让您对它做任何想做的事情(这很糟糕),就像您尝试使用一个已经存在的对象一样。如果它是整数,则作为字符串传递,应用程序将崩溃。(发生这种情况是因为Swift正在使用动态类型输入,只会给您一个运行时错误)
String
,Array
和Dictionary
不是类,因为它们使用Any。