之前在使用Swift的过程中没有注意到这两者的区别,最近看到一篇文章介绍二者的区别,记下笔记。
AnyObject 可以代表任何 class 类型的实例
Any 可以表示任意类型,甚至包括方法 (func) 类型
接下来看下二者的定义
/// The protocol to which all types implicitly conform.
public typealias Any = protocol<>
/// The protocol to which all classes implicitly conform.
@objc public protocol AnyObject {
}
从以上可以看出Any
和AnyObject
都是协议而且,并且从Apple提供的注释中可以看出所有的类型都隱式实现了Any协议,所有的class都隱式实现了AnyObject协议。
可以总结为:###
AnyObject
是Any
的子集
- 所有用
class
关键字定义的对象就是AnyObject
- 所有不是用
class
关键字定义的对象就不是AnyObject
,而是Any
测试代码:
func test(testObject object:Any) -> String {
if object is AnyObject {
return "传入的是一个引用(class)类型"
}
return "传入的是一个值类型"
}
/// 测试Block类型
let block = {
print("Hello World")
}
/// 测试元组
let http404Error = (404, "Not Found")
/// 测试数组
let array1:Array<Any> = []
let array2:Array<Int> = []
let array3:Array<AnyObject> = []
print(test(testObject: block))
print(test(testObject: http404Error))
print(test(testObject: array1))
print(test(testObject: array2))
print(test(testObject: array3))
测试结果:
test1.jpg从测试结果可以看出array2和array3的结果不符合预期,看看是不是被隐式转换为NSArray了。
if array1 is NSArray {
print("array1 is converted to NSArray")
}
if array2 is NSArray {
print("array1 is converted to NSArray")
}
if array3 is NSArray {
print("array1 is converted to NSArray")
}
测试结果2:
test2.jpg
网友评论