swift5基本语法-Self 与self

在swift 开发过程中,尤其是第三方库中,我们经常可以看到Self,但是Selfself,它们两个是不一样的,下面我们通过示例来对比下两者的区别。

相信大家都知道self这个关键字的具体作用,它跟OC里的self基本一样,但是Self关键字只能用在类里, 作为函数返回值类型, 表示当前类,限定返回值跟方法调用者必须是同一类型,在定义协议的时候Self用的频率很高,而且当你用错Self的时候编译器会这样提示'Self' is only available in a protocol or as the result of a method in a class

例1:Self关键字用在类里, 作为函数返回值类型, 表示当前类。
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()   
        let objA = TestClass(a: 1, b: 2)
        objA.testA(param: 3)
        objA.testB(param: 4)
        print("a:\(objA.a),b:\(objA.b)")
    }
}

class TestClass {
    var a: Int
    var b: Int
    init(a: Int, b: Int) {
        self.a = a
        self.b = b
    }
    
    @discardableResult
    func testA(param: Int) -> Self {
        self.a = param
        return self
    }
    @discardableResult
    func testB(param: Int) -> TestClass {
        self.b = param
        return self
    }
}

小结:
这段代码里有self和Self, self指向类自身;Self只能作为函数关键字, testA和testB函数的返回值是TestClass类型,这里 TestClass 和 Self 等价。这里的返回值TestClass和OC中instancetype,有点异曲同工之处。

例2:Self 在协议中的使用场景
protocol SomeProtocol {
    func test() -> Self
}

class Person : SomeProtocol {
    required init() {}
    func test() -> Self {
        type(of: self).init()
    }
}

小结:
Self可以用于协议(protocol)中限制相关的类型,比如SomeProtocol协议中 func test() -> Self 方法中返回Self,也就是说Person类继承了SomeProtocol协议必须返回Self(返回值必须是Person类型)。

注意:
1.test() 方法中不能直接返回Person(),否则会报类型不匹配错误;

image.png

原因: 主要是考虑,如果实现这个协议的类,有子类,即也就是有继承关系,那么直接返回父类将会报错,因为我们肯定希望调用子类就返回子类。
image.png

所以,考虑到上述继承的场景,我们期望返回的必然是当前对象类,需要通过 type(of: self)获取当前对象,然后再调用初始化方法即可。
正确的写法如下所示:
image.png

END!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值