Swift中的Any&AnyObject

1,962 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

明天就国庆7天长假了,今天我们聊点轻松入门的。

Swift中的Any、AnyObject到底如何理解?这对于一个从OC过渡到Swift,或者刚入门Swift的童鞋都会有一定小小的困恼吧?

以下是我的一点理解。

Swift中三大类

这个地方敲重点记下,目前Swift的数据,无非被这三大类定义:

  • struct(结构体)

  • enum(枚举)

  • class(类)

其中struct和enum可以说是同根同源,都在上,程序猿不用管理它的生命周期。

class在上,程序猿需要管理它的生命周期。

再者上的struct和enum都是值类型,上的class是引用类型。

不懂先记下来,这些都是需要实战才能完全理解的。

Any

我们先看看Any到底是个啥东西:

protocol Any {}

Any其实是一个空协议,并且根据查阅资料看,三大类在创建的时候,都隐式的遵守了这个协议,你可以理解成为这样:


struct Person: Any {}

class Animal: Any {}

enum Type: Any {}

可以这么说,Any可以表示Swift语言构建的任何类型。

追加一句:包括函数类型,即闭包类型。像() -> Void也可以用Any表示

AnyObject

AnyObject其实就表示的就比较单一了,它表示的是类的类型。我摘选了一部分源码和注释,大家看看就理解了。

/// The protocol to which all classes implicitly conform.
///
/// You use `AnyObject` when you need the flexibility of an untyped object or
/// when you use bridged Objective-C methods and properties that return an
/// untyped result. `AnyObject` can be used as the concrete type for an
/// instance of any class, class type, or class-only protocol.

public typealias AnyObject

大家可能会好奇,那么我们经常这么写代码:

class AClass: NSObject {}

AnyObject和NSObject到底啥关系?

其实有两点我要解释:

  • 写class的时候不需要都继承NSObject,Swift中的class会隐式继承一个特有的Swift.SwiftObject。建议IDE提示你需要添加NSObject的时候,再添加,一般这种时候都是需要实现代理。

  • AnyObject可以表示class,而class: NSObject怎么看都只是class的更细化分支,所以可以理解AnyObject包容了NSObject。

参考文档:

SwiftObject.h

总结

Any可以表示任何类型,包括函数类型,下面这段代码跑起来没毛病:

let callback: (() -> Void) = {  }

func aFunction(arg: Any) {

}

aFunction(arg: callback)

AnyObject代表任何class类型的对象实例,而继承了NSObject的class,也不过是AnyObject的一个子集。

Any、AnyObject.jpg

我们下期见。