美文网首页iOS技术
swift之guard let `self` = self el

swift之guard let `self` = self el

作者: 小羊爱学习 | 来源:发表于2022-06-23 18:09 被阅读0次

    在使用block过程中经常会遇到使用[weak self] 或者 [unowned self]来防止block的循环引用,通常情况下我们会使用以下语法来解决,在闭包的最开始加上这行全是关键字的代码:

    [weak self] in guard let self = self else { return } 
    

    它会先弱引用 self,然后确认我们能够暂时强引用 self,在闭包运行结束之后就释放对 self 的引用,这样就能解决大部分闭包导致的引用循环了!

    也可以在代码块中直接使用self?或者self!解包

    Swift 4.2之前,self 是全局保留关键字,所以如果在逃逸闭包中如果在闭包中把 self 标记为 weak 后,如果要使用需要使用 `` 包起来使用:

    xx.xxBlock = {[weak self] in
                guard let `self` = self else { return }
                ///code....
            }
    

    Swift之父坦白,这是个bug 不过开发者似乎很喜欢这个bug。

    虽然这样解决了变量名的问题,但是也带来另外一个困扰,控制台里不会显示一个名为 self 的变量。所以也有一种普遍的做法是取个别名,比如 strongSelf

    xx.xxBlock = {[weak self] in
                guard let strongSelf = self { else return }
                ///code....
            }
    

    Swift4.2之后,苹果终于响应了这个请求,现在 otional binding 中 self 不再作为保留关键字。因此我们可以光明正大的这么写了

    xx.xxBlock = {[weak self] in
                guard let self = self else { return }
                ///code....
            }
    

    相关文章

      网友评论

        本文标题:swift之guard let `self` = self el

        本文链接:https://www.haomeiwen.com/subject/jexmvrtx.html