最新发布

self vs Self

学习 swift 语言过程中,会不断发现 swift 一些匪夷所思的语法。学过之后,常常反问一句,真的有必要吗? 没学之前,谁会想到 selfSelf 是不同的。

关键字 self

场景 1 前置 self.

前置 self. 是最常使用的场景,此时关键字 self 同其他语言的 this 关键字类似,可以代表编码过程中当前代码运行所属实例。

class Foo {
    private var name: String = ""
    init(_ name: String) {
        self.name = name //属性名与参数名发生歧义,通过 self. 进行明确指定
    }

    func show() {
        print("name = \(name)") //没有歧义时,直接使用属性名即可
    }
}

需要注意的是,前置 self. 代表的是当前类型的实例对象。在类型定义中,如果前置 self.出现在内嵌类型或匿名函数时,要注意其所指。这点和 es6 简明教程 - 令人崩溃的 this 有些类似。

在 es6 中, 关键字 this, 与函数、对象、类无关,只与执行期上下文有关.

extension Foo {
    //增加一个计算属性 通过匿名函数进行赋值,内部访问 前置 self. 属性
     var age: Int = {
        //print(self.name) //在 swift 5.7 中会直接提示错误 无法找到 self 对象
        return 25
    }()
}

在 swift 5.7 中会直接提示错误 无法找到 self 对象。

场景 2 后置 .self

... 阅读全文

目录导航