iOS学习iOS Developer

Swift中的self

2017-03-01  本文已影响459人  gogo_coder

先来看一段代码

self in closure

当然这段代码是有些问题的,但是却对研究我们今天的主题却是非常有用。

执行后打印出来的内容是这样的

self is a function

有些同学要问了。self怎么是个function,不应该是一个当前类的实例吗?

再看下面这段代码:

lazy var self is an instance

有没有很奇怪,这边的self怎么就变成实例了。对,就是因为lazy关键字。查阅Apple文档可以看到这样一段话:

Swift docs

也就是说加了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 var self static func self

但是如果你同时实现了static和instance方法,那么又可以通过编译了。

static & instance

终极版:

self

证明完毕。

上一篇 下一篇

猜你喜欢

热点阅读