小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
明天就国庆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。
参考文档:
总结
Any可以表示任何类型,包括函数类型,下面这段代码跑起来没毛病:
let callback: (() -> Void) = { }
func aFunction(arg: Any) {
}
aFunction(arg: callback)
复制代码
AnyObject代表任何class类型的对象实例,而继承了NSObject的class,也不过是AnyObject的一个子集。
我们下期见。