0%

Swift中的AnyClass、AnyObject、Any

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class FDEItemModel {}
let anyA: AnyObject = FDEItemModel.init() //对象,类的实例
let anyB: AnyObject = FDEItemModel.self //类对象,元类的实例
let anyC: AnyObject = FDEItemModel.init().self

let defaulA = FDEItemModel.init() //FDEItemModel
let defaulB = FDEItemModel.self //FDEItemModel.Type
let defaulC = FDEItemModel.init().self //FDEItemModel

let arr1: [AnyObject] = ["123" as AnyObject, 123 as AnyObject, [123] as AnyObject]

let arr2: [AnyObject] = [NSString("123"),
NSNumber(123),
true as AnyObject,
People.init(),
People.self
]
print(arr2)

...
[123, 123, 1, <OSHybridDemo.People: 0x600002348b90>, OSHybridDemo.People]

在使用AnyObject 对象时要特别注意如果你需要调用它的属性则最好先downcast为实际的类型,如果不downcast那么系统可能获取的是其他类的同名属性,得到的值将是nil。

1
2
3
4
5
6
7
let node1 = BinaryTreeNode.init(1)
let node2 = BinaryTreeNode.init(2)
node1.left = node2
let curr: AnyObject = node1
let left: AnyObject? = curr.left //不会报错
let left1: AnyObject? = (curr as! BinaryTreeNode).left
print("left:\(left), left1:\(left1!)") //left:nil, left1:AlgorithmUtils.BinaryTreeNode

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
2
3
4
5
6
let anyB: AnyObject = People.self
let anyC: AnyClass = People.self
let anyD: AnyClass = FDEItemModel.init() //报错:Cannot convert value of type 'FDEItemModel' to specified type 'AnyClass' (aka 'any AnyObject.Type')

let obj1 = (anyB as! People.Type).init()
let obj2 = (anyC as! People.Type).init()

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
2
3
4
let a: AnyObject = Int.init(2.0) as AnyObject
print("a type:\(type(of: a))") //a type:__NSCFNumber
let b = 3
let c = a as! Int + b

三者之间的关系:

觉得文章有帮助可以打赏一下哦!