1.AnyObject
定义:
public typealias AnyObject
说明:
The protocol to which all classes implicitly conform.
AnyObject can be used as the concrete type for an instance of any class, class type, or class-only protocol.
The flexible behavior of the AnyObject
protocol is similar to
Objective-C’s id
type.
AnyObject:用于表示任意类,元类的实例的具体类型.
对于”123”或123这些基础数据类型在Swift中是结构体类型,所以这里需要将其强转为AnyObject类型,此时它们的类型将是
OC的NSTaggedPointerString和__NSCFNumber等对象类型.不强转的话编译会出错.
eg:
1 | class FDEItemModel {} |
在使用AnyObject 对象时要特别注意如果你需要调用它的属性则最好先downcast为实际的类型,如果不downcast那么系统可能获取的是其他类的同名属性,得到的值将是nil。
1 | let node1 = BinaryTreeNode.init(1) |
2.AnyClass
定义:
typealias AnyClass = AnyObject.Type
说明:
The protocol to which all class types implicitly conform.
You can use the AnyClass protocol as the concrete type for an instance of any class.
AnyClass:用于表示任意元类的实例的具体类型.
1 | let anyB: AnyObject = People.self |
3.Any
Any:用于表示任意类型.
之所以出现Any主要是由于AnyObject只能表示类的实例.而 Swift 中所有的基本类型,包括 Array 和 Dictionary 这些传统意义上会是 class 的东西,统统都是 struct 类型,并不能由 AnyObject 来表示,于是 Apple 提出了一个更为特殊的 Any,除了 class 以外,它还可以表示包括 struct 和 enum 在内的所有类型。
let a: AnyObject = Int.init(2.0)
会编译错误,需要强转为AnyObject,此时a的实际类型将不再是Int而是__NSCFNumber
,这表明系统会将这些struct转为对应的OC类。
1 | let a: AnyObject = Int.init(2.0) as AnyObject |
三者之间的关系: