Swift-闭包

作者: FlyElephant | 来源:发表于2016-11-21 22:55 被阅读60次

Swift中的闭包和OC中的Block类似,语法格式不一样,但都是是用于c异步回调或者类之间的通信。本质上是一段可执行的函数代码,也可以看做是一种特殊的数据类型.

基础定义

我们先来回顾一下OC中的Block定义和写法,基础写法:
<pre><code>`

int (^addBlock)(int a,int b)=^(int a,int b){
        return a+b;
 };
 NSLog(@"FlyElephant-addBlock的结果:%d",addBlock(90,72));`</code></pre>

Swift中闭包写法:
<pre><code>let addBlock:(Int,Int)->(Int) = { (a,b) in return a + b; } let addResult = addBlock(100,400)</code></pre>

对比之下,Swift取消了^的写法, 通过in来区分参数和执行代码块,写的时候我们会看到将参数和in放在同一行的写法:
<pre><code>let addBlock:(Int,Int)->(Int) = { (a,b) in return a + b; }</code></pre>
OC中我们可以通过typedef将常用的Block进行抽取,Swift中我们可以通过typealias来实现:
<pre><code>`
typealias CompleteBlock = (Int,Int)->(Int);

    let complete:CompleteBlock = { (a,b) in
        return a-b;
    }`</code></pre>

特殊闭包

项目中Block涉及最多的地方就是网络请求,从网络请求数据,成功和失败都会通过相应的Block来实现项目状态的变更:
网络请求:
<pre><code>`
func requestData1(urlString:String,succeed: ((Any?)->(Void))?){

    let request = URLRequest(url: URL(string: urlString)!);
    //发送网络请求
    NSURLConnection.sendAsynchronousRequest(request, queue: OperationQueue()) { (_, data, error) in
        if error == nil {
            succeed?(data);
        }
    }
}`</code></pre>

网络请求调用:
<pre><code>requestData1(urlString: "") { (data) -> (Void) in print("网络请求回调") }</code></pre>

这个是最常见的网络请求闭包异步回调,不过其中有一个细节需要注意的,当闭包作为函数的最后一个参数时,可以省略前面的括号,也就是常说的尾随闭包,没什么特殊的作用,但是会增加代码的易读性和语法简洁性.

大家应该多少听说过逃逸闭包,名字听起来有点唬人,闭包更多的时候是异步回调,通过是函数执行完成,闭包里面的代码还没有执行,所以需要逃逸才能执行稍后的回调.

逃逸闭包需要,加入@escaping关键字,上面的网络请求可以写成以下方式:
<pre><code>`
func requestData1(urlString:String,succeed: @escaping ((Any?)->(Void))){

    let request = URLRequest(url: URL(string: urlString)!);
    //发送网络请求
    NSURLConnection.sendAsynchronousRequest(request, queue: OperationQueue()) { (_, data, error) in
        if error == nil {
            succeed(data);
        }
    }
}`</code></pre>

最上面的网络回调是闭包可选类型,不是闭包类型,所以可以不加入@escaping关键字.

相关文章

  • Swift-闭包

    Swift-闭包 Swift闭包的含义 闭包是自包含的功能代码块,可以用作函数的参数或者返回值 闭包可以捕获上下文...

  • Swift-闭包

    闭包是swift中非常重要的一个知识点。类似于objective-c中的block,其实函数就相当于一个特殊的闭包...

  • swift-闭包

    闭包 ≈ block, 函数, 匿名函数 (闭包和函数都是引用类型,能改变值)(值类型不能改变值) 对上面的传的函...

  • Swift- 闭包

    闭包在Swift中非常有用。通俗的解释就是一个Int类型里存储着一个整数,一个String类型包含着一串字符,同样...

  • Swift-闭包

    Swift中的闭包和OC中的Block类似,语法格式不一样,但都是是用于c异步回调或者类之间的通信。本质上是一段可...

  • Swift-闭包

    闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用。 这被称为关闭这些常量和变量。 Swift处理所有的...

  • Swift-闭包

    闭包是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。 在Swift中的闭包与OC中的block类似。 ...

  • Swift-闭包

    闭包的特点:一个函数有权访问另外一个函数内的变量和参数 闭包—匿名函数 结尾闭包 衍生 内容捕获 闭包和函数是引用类型

  • Swift-闭包

    Swift 闭包 函数 ()->() Swift 中的闭包和 Objective-C 中的 block 类似,闭包...

  • swift-闭包

    这里总结主要看点 : 闭包传值问题 闭包和block基本一样,传值问题可以参照OC的中方式去考虑问题 . 引用学习...

网友评论

    本文标题:Swift-闭包

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