• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Swift2.1keyword @noescape介绍

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

@noescape优化编译器编译,swift 2.1引入。

函数假设有一个一个參数是closure的话,能够在前面加一个关键字@noescape表示在函数return前closure生命周期结束,能够优化编译。

(closure 是引用类型, 能够引用到别的地方,例如以下:)

class A{
    var b: (Void -> Void)!

    func lalala(a: (Void->Void)){
        self.b = a//引用到属性b了
    }
}

像上面的情况lalala的參数a是不能在前面标记@noescape

class A{
    var b: (Void -> Void)!

    func aa(@noescape a: (Void->Void)){
        self.b = a//会报错,报类型不一样
    }
}

而没有引用到外层的closure能够加@noescape比如

class A{
    var b: (Void -> Void)!

    func aa(@noescape a: (Void->Void)){
        a()//不会报错,这个不会再外部再次被调用
    }
}

@noescape 还有个特性就是标记了 @noescape的closure能够免去写引用self。swift的普通closure使用self时都须要。这个能够例外。

由于他相当于一个同步的调用。不会产生循环引用,所以不用特意强调self

class A{
    var b: (Void -> Void)!

    var k = 0//用来调用的

    func aa(@noescape a: (Void->Void)){
        a()
    }

    func bb(){
        aa { () -> Void in
            k = 1//一般的closure都是要self.k = 1,@noescape则不须要
        }
    }
}

讨论:啥时候会用到@noescape?如今非常多函数式编程,比方有个排序,须要一个比較的closure作为參数,这样的closure都会是同步调用完成获得返回值。这样的能够放一个@noescape在前面,可优化内存。引用self不必写self。其它的closure在外部引用着等待将来回掉用的则不能@noescape,由于它会escape。整体来说这个@noescape没啥卵用。可是有些人会用,可能会吓到你。比方我昨天就看到一个用了这个的,这个基本能够无视。苹果文档链接


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
the-swift-programming-language学习笔记发布时间:2022-07-13
下一篇:
[Swift]LeetCode234.回文链表|PalindromeLinkedList发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap