先来看一段代码
当然这段代码是有些问题的,但是却对研究我们今天的主题却是非常有用。
执行后打印出来的内容是这样的
有些同学要问了。self怎么是个function,不应该是一个当前类的实例吗?
再看下面这段代码:
有没有很奇怪,这边的self怎么就变成实例了。对,就是因为lazy关键字。查阅Apple文档可以看到这样一段话:
也就是说加了lazy的function保证了在执行当前闭包的时候当前实例已经被初始化了。换句话说,没有lazy关键字修饰的function在执行的时候当前实例可能还没有被初始化,那么self自然不能用来指代当前实例。So,这边的self到底指向了什么呢?
我们知道在很多语言中都有`self`关键字,比如Ruby和Python。
还有一些语言中关键字使用了`this`,比如C#, Java和JavaScript,也是同样的效果。
查阅Apple的文档以及javascript的文档可以知道,这类关键字都指向了当前函数作用域的上下文。Swift与JavaScript不同点在于JavaScript中的this默认指向了`global context`而swift中的self默认是undefined。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this
再继续找,在NSObjectProtocol我们找到了这个
以及:
好了,真相只有一个。
因为NSObjectProtocol中重写了self关键字,所以这里的self就是指向了'self'().
可以来做个实验验证一下,下面定义了一个类,没有继承自NSObject:
self变成了undefined。
这里的closure类似于`SomethingNotInhertitedFromNsObject`中的static function, 之所以说类似是因为如果我们将static var `self`: String改为static func `self`() -> String将会无法通过编译。
但是如果你同时实现了static和instance方法,那么又可以通过编译了。
终极版:
证明完毕。