Swift2.1关键字 @noescape介绍

@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没啥卵用,但是有些人会用,可能会吓到你。比如我昨天就看到一个用了这个的,这个基本可以无视。苹果文档链接

时间: 2024-11-07 08:36:34

Swift2.1关键字 @noescape介绍的相关文章

Swift2.1keyword @noescape介绍

@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是不能在前面标记

iOS开发——Swift篇&Swift关键字详细介绍

Swift关键字详细介绍 每一种语言都有相应的关键词,每个关键词都有他独特的作用,来看看swfit中的关键词: 关键词: 用来声明的: “ class, deinit, enum, extension, func, import, init, let, protocol, static, struct, subscript, typealias, var.” 用于子句的: “ break, case, continue, default, do, else, fallthrough, if, i

LPTHW 笨办法学python 37章 python关键字/关键词介绍

本章简要的介绍了各种关键词: and:[布尔运算]且 del: 删除变量(函数,类) from: 从某一个库或者文件读取 not:[布尔运算]非 while: while-loop 关键字,后跟循环条件 as: 通常和import类叠加使用,代表以某个其他名称加载某个模块. elif: if分支控制的一部分. global: 声明一个变量为全局变量. or:[布尔运算]或 with:执行一个动作,通常和as一起使用,使用with后,完成动作后,必定关闭或者退出. assert: 声明一个错误.使

REF和OUT关键字的介绍

声明:本文是本人最初写在51CTO上的一篇学习笔记,原文地址为:http://kestrelsaga.blog.51cto.com/3015222/717906 ref与out的比较: ref与out关键字都是使参数通过引用来传递的,不同的是ref 要求变量必须在传递之前进行初始化,而out 的参数在传递之前不需要显式初始化. 在使用ref或out参数,方法定义和调用方法都必须显式使用ref或out关键字,如: 例1(out): 01.class OutExample 02.{ 03. stat

关键字static介绍

static关键字 java中针对多个对象有共同的成员变量值得时候,就提供了static关键字来修饰. (1)静态的意思.可以修饰成员变量和成员方法. (2)静态的特点: A:随着类的加载而加载 B:优先与对象存在 C:被类的所有对象共享 这其实也是我们判断该不该使用静态的依据. D:可以通过类名调用 既可以通过对象名调用,也可以通过类名调用,建议通过类名调用. (3)静态的注意事项: A:在静态方法中没有this对象 B:静态只能访问静态 (5)静态变量和成员变量的区别 A:所属不同 静态变量

莫名其妙的标记之@noescape

Swift 中经常遇到一些不熟悉的关键字, 例如@autoclosure, @noescape...等等, 为什么要加这样的关键字, 我自己写方法的时候什么时候要加, 什么时候不加, 都是应该考虑的问题, 所以打算写一系列文章来介绍一下这些关键字. @noescape @noescape 用来标记一个闭包, 用法如下 func hostFunc(@noescape closure: () -> ()) -> Void @noescape字面意思是无法逃脱. 在上例中, closure 被@no

java多线程系类:基础篇:04synchronized关键字

概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchronized代码块4. 实例锁 和 全局锁 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3479202.html 1. synchronized原理 在java中,每一个对象有且仅有一个同步锁.这也意味着,同步锁是依赖于对象而存在.当我们调用某对象的sy

SQL Server(函数) 关键字的使用 三

三, 函数关键字 -- 使用介绍 28, Function的使用(Function的内建 SQL函数)? 内建 SQL 函数的语法是: SELECT function(列) FROM 表) 29, avg() 的使用(avg() 返回列的平均值) AVG 函数返回数值列的平均值.NULL 值不包括在计算中. SELECT AVG(column_name) FROM table_name 30, count()的使用(count()的指定列的数目) COUNT(column_name) 函数返回指

C++新特性-auto关键字

1 auto关键字 在介绍之前,我们先来了解一个新增的关键字auto. 在C++11中,如果编译器能够在变量的声明时,能够推断出其类型:那么,代替之前必须把变量类型放在声明之前的做法,可以直接用auto进行变量的声明: int x = 4; 也就是说,上面的声明语句可以被下面的语句替代: auto x = 4; 当然了,这肯定不是auto关键字设计的根本目的.它最大的作用还是和模板及容器配合使用: vector<int> vec; auto itr = vec.iterator(); // 代