我不明白何时在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,你StringS作为NSString,你ArrayS作为NSArray,你的字典如NSDictionary,所有这一切都是对象。使用AnyObject用作值类型的字典可以转换为NSDictionary,但是使用Any则不能。
泛型是类型安全的,这意味着如果您将字符串作为泛型传递并尝试将其用作整数,则编译器将抱怨并且您将无法编译您的(很好)。(发生这种情况是因为Swift使用静态类型,并且能够给您一个编译器错误)。如果您使用AnyObject,则编译器不知道该对象可以视为String或Integer,并且基本上可以让您对它做任何想做的事情(这很糟糕),就像您尝试使用一个已经存在的对象一样。如果它是整数,则作为字符串传递,应用程序将崩溃。(发生这种情况是因为Swift正在使用动态类型输入,只会给您一个运行时错误)
String,Array和Dictionary不是类,因为它们使用Any。