Swift中的self

先来看一段代码

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

证明完毕。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,095评论 19 139
  • 126.析构器 在一个类实例销毁前,一个析构器会立即调用。使用deinit 关键字来表示析构器, 跟构造器写法类似...
    无沣阅读 4,298评论 0 4
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 9,473评论 1 10
  • 20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...
    iOS_恒仔阅读 6,895评论 1 6
  • 昨日玫瑰已采 今日三朵玫瑰 1.早起 2.回听惠婷老师答疑 3.阅读新书 【幸福实修99天目标】 1.臣服父母,每...
    叶青丁当妈阅读 1,441评论 0 1

友情链接更多精彩内容