博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《从零开始学Swift》学习笔记(Day 22)——闭包那些事儿!
阅读量:6047 次
发布时间:2019-06-20

本文共 1819 字,大约阅读时间需要 6 分钟。

原创文章,欢迎转载。转载请注明:关东升的博客

 

我给Swift 中的闭包一个定义:闭包是自包含的匿名函数代码块,可以作为表达式、函数参数和函数返回值,闭包表达式的运算结果是一种函数类型。

Swift中的闭包类似于Objective-C中的代码块、Java中的匿名内部类。 

使用闭包表达式

Swift中的闭包表达式很灵活,其标准语法格式如下:

{ (参数列表) ->返回值类型in

    语句组

}

其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是后面有in关键字。

Swift提供了多种闭包简化写法,我来介绍下面几种不同形式: 

1、类型推断简化

类型推断是Swift的强项,Swift可以根据上下文环境推断出参数类型和返回值类型。以下代码是标准形式的闭包:

{(a:Int, b:Int) -> Intin    return a + b}

Swift能推断出参数abInt类型,返回值也是Int类型。简化形式如下:

{(a, b) in return a + b }{a, b in return a + b }  //参数列表括号也可以省略

2、隐藏return关键字

在闭包内部语句组只有一条语句,如return a + b等,那么这种语句都是返回语句。前面的关键字return可以省略,省略形式如下:

{a, b in a + b }

使用这种简化方式修改后的示例代码如下:

func calculate(opr:String)-> (Int,Int)-> Int {    var result : (Int,Int)-> Int        switch (opr) {    case "+" :        result = {a, b in a + b }//return关键字省略了    default:        result = {a, b in a - b }//return关键字省略了    }    return result}

省略的前提是闭包中只有一条return语句。 

3、省略参数名称

Swift提供了参数名省略功能,我们可以用$0$1$2…来指定闭包中参数,$0指代第一个参数,$1指代第二个参数,$2指代第三个参数,以此类推$n+1指代第n个参数。

使用参数名省略功能,在闭包中必须省略参数列表定义,Swift能够推断出这些缩写参数的类型。参数列表省略了,in关键字也需要省略。参数名省略之后如下所示:

{$0 + $1}

使用参数名省略后的示例代码如下:

func calculate(opr:String)-> (Int,Int)-> Int {     var result : (Int,Int)-> Int        switch (opr) {    case "+" :        result = {$0 + $1}//采用了参数名省略    default:        result = {$0 - $1}//采用了参数名省略    }    return result} let f1:(Int,Int)-> Int= calculate("+")print("10 + 5 =\(f1(10,5))") let f2:(Int,Int)-> Int= calculate("-")print("10 - 5 = \(f2(10,5))")

 

4、使用闭包返回值

闭包表达本质上是函数类型,是有返回值的,我们可以直接在表达式中使用闭包的返回值。重新修改addsub闭包,示例代码如下:

let c1:Int = {(a:Int,b:Int) -> Int in                return a + b               }(10,5)    print("10 + 5 =\(c1)")

 

解释:给c1赋值,后面是一个闭包表达式。但是闭包表达式不能直接赋值给c1,因为c1Int类型,需要闭包的返回值。这就需要在闭包结尾的大括号后面接一对小括号(10,5),通过小括号(10,5)为闭包传递参数。

 

 

欢迎关注关东升新浪微博@tony_关东升。

关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
                             
更多精品iOSCocos、移动设计课程请关注智捷课堂官方网站:
智捷课堂论坛网站:

 

你可能感兴趣的文章
关于软件工程是不是教那些不会写程序的人开发软件的一些看法。
查看>>
关于Oracle 的安装记(不定期更新)
查看>>
IIS功能添加
查看>>
unix平台下I/O聚集和分离的一种方案
查看>>
C/C++基本数据类型
查看>>
netty百万连接跟踪记录
查看>>
glances内存分析工具使用
查看>>
杭电oj1596--find the safest road(Spfa)
查看>>
storm配置:设置worker进程内存大小
查看>>
硬盘读取不了-->>完美解决
查看>>
Python下的opencv小问题大智慧
查看>>
logstash file input sincedb path on osx
查看>>
python 最小二乘拟合,反卷积,卡方检验
查看>>
[译] 构建大型 React 应用程序的最佳实践
查看>>
Sass::SyntaxError related to active_admin/mixins
查看>>
Practice - iOS 项目持续集成实践(一)
查看>>
录制屏幕,使用ffmpeg就能做到
查看>>
cocoaPods私有库的创建与使用
查看>>
swift - 画图 - 画矩形,虚线,圆和半圆
查看>>
IE中在a标签里的图片会显示边框
查看>>