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

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

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

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

使用闭包表达式

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

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

    语句组

}

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

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

1、类型推断简化

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

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

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

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

2、隐藏return关键字

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

{a, b in a + b }

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

1
2
3
4
5
6
7
8
9
10
11
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}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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闭包,示例代码如下:

1
2
3
4
5
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关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1746406,如需转载请自行联系原作者

你可能感兴趣的文章
Oracle12c数据的冷备份与恢复
查看>>
论C++中vector的N种遍历方法
查看>>
智能DNS服务器配置
查看>>
我的友情链接
查看>>
tomcat8.0配置虚拟主机时,访问404问题
查看>>
数据泵文件
查看>>
Java ThreadPoolExecutor线程池使用说明
查看>>
Linux-磁盘管理
查看>>
我的友情链接
查看>>
关于ThinkPHP的一点小小知识点的补充
查看>>
windows系统中安静的安装补丁
查看>>
MongoDB使用中的一些问题
查看>>
play02-Getting started-Creating a new application
查看>>
系统架构
查看>>
UITableView是不会响应touchesBegan:方法的
查看>>
Computer-memory
查看>>
redis 实践笔记(初步)
查看>>
背道而驰or殊途同归?区块链与云计算未来趋势
查看>>
Spring整合JMS(四)——事务管理
查看>>
设计模式学习笔记(七)之模板方法模式(Template Method)
查看>>