Swift3.x - Any、AnyObject和AnyClass的区别

在Swift中使用AnyObject遇到的问题:方法回调的参数类型不确定,设置接收AnyObject,传参数的时候,传入String类型,会导致编译报错!


Any、AnyObject

Swift为不确定类型提供了两种特殊类型:

  • Any can represent an instance of any type at all, including function types.
  • AnyObject can represent an instance of any class type.

Any:代表任意类型实例,包括方法类型。
AnyObject:代表任意'类(class)'类型的实例。

  • AnyObject
    AnyObject在API中的声明:
@objc public protocol AnyObject {
}

并且在官方注释为:

/// The protocol to which all classes implicitly conform.

可见AnyObject为一个空协议,并且默认所有Class均隐式遵循此协议!

  • Any
    Any:天下我最大,可以代表任意类型的实例。
    官方文档给出了一个例子:
    var things = [Any]()
    things.append(0)
    things.append(0.0)
    things.append(42)
    things.append(3.14159)
    things.append("hello")
    things.append((3.0, 5.0))
    things.append({ (name: String) -> String in "Hello, \(name)" })

Any类型的数组中包含了各种类型的数据,包括非Class类型的String类型,在Swfit中的String为结构体类型。
Any是可以代表函数类型的,举个栗子:

  class ViewController: UIViewController {

      override func touchesBegan(_ touches: Set, with event: UIEvent?) {

          sayWhat(str: sayHello())
        
      }
      func sayWhat(str : Any){
        
        print("i say \(str)")
    
      }
    
      func sayHello() -> String{
          return "hello world!"
      }
    
  }

结果输出:i say hello world!

  • AnyClass
    AnyClass在API中的声明:
public typealias AnyClass = AnyObject.Type

并且官方文档的注释为:

/// The protocol to which all classes implicitly conform.

AnyClass仅为AnyObject.Type的别名!通过 AnyObject.Type 这种方式所得到是一个元类型 (Meta)。
详情参阅喵神的文章:
传送门:http://swifter.tips/self-anyclass/
Zeb

你可能感兴趣的:(Swift3.x - Any、AnyObject和AnyClass的区别)