美文网首页Swift学习
Any 和 AnyObject的区别

Any 和 AnyObject的区别

作者: 我爱WSP | 来源:发表于2016-06-16 15:05 被阅读2111次

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

    相关文章

      网友评论

        本文标题:Any 和 AnyObject的区别

        本文链接:https://www.haomeiwen.com/subject/iammdttx.html