加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift学习日志—— 闭包(一)

发布时间:2020-12-14 01:32:00 所属栏目:百科 来源:网络整理
导读:Swift中的闭包定义是:闭包是自包含的匿名函数代码块,可以作为表达式、函数参数和函数返回值,闭包表达式的运算结果是一种函数类型。Swift中的闭包类似于Objective-C中的代码块block、Java中的匿名内部类。 使用闭包表达式 Swift中的闭包表达式很灵活,其标

Swift中的闭包定义是:闭包是自包含的匿名函数代码块,可以作为表达式、函数参数和函数返回值,闭包表达式的运算结果是一种函数类型。Swift中的闭包类似于Objective-C中的代码块block、Java中的匿名内部类。

使用闭包表达式

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

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

语句组

}

其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是后面有in关键字。Swift提供了多种闭包简化写法,我来介绍下面几种不同形式:

1、类型推断简化

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

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

Swift能推断出参数a和b是Int类型,返回值也是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(str :String)-> (Int,Int)-> Int {  
    var result : (Int,Int)-> Int  
     
    switch (str) {  
    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(str :String)-> (Int,Int)-> Int {
var result : (Int,Int)-> Int
switch (str) {
case "+" :
result = {$0 + $1} //参数名省略
default:
result = {$0 - $1} //参数名省略
}
return result
}
let s1:(Int,Int)-> Int = calculate("+")
print("10 + 10= (s1(10,10))")
let s2:(Int,Int)-> Int = calculate("-")
print("10 - 10 = (s2(10,10))")

4、使用闭包返回值

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

let a1:Int = {(a:Int,b:Int) -> Int in
return a + b
}(10,10) 

print("10 + 10= (a1)")

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


参考自The Swift Programming Language 官方文档

转载请注明 转载jaccty的博客

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读