Swift学习

Any 和 AnyObject的区别

2016-06-16  本文已影响2111人  我爱WSP

之前在使用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 {

}

从以上可以看出AnyAnyObject都是协议而且,并且从Apple提供的注释中可以看出所有的类型都隱式实现了Any协议,所有的class都隱式实现了AnyObject协议。

可以总结为:###

  • AnyObjectAny的子集
  • 所有用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
上一篇下一篇

猜你喜欢

热点阅读