swift学习记录(闭包)

闭包是可以在代码中传递和使用的自包含的功能模块。可以捕获和存储上下文任何引用常量和变量,也就是关闭这些常量和变量,因此得名“闭包。相当于java 中的匿名内部类、OC中的block。

可以作为表达式、函数参数函数返回值,闭包表达式的运算结果是一种函数类型。

闭包表达式语法:

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

语句组

}

闭包的参数可以使用 常量 、变量、元组和输入输出参数(inout),不提供默认值,参数列表中的最后一个参数,也可以使用可变参数。

in 关键字 引入内联闭包的函数体,表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始。

多返回值,可以借助元组。

闭包作为函数参数的事例:

/**
 参数1:Int 数组
 参数2:是一个函数类型的参数
 返回值:Int 数组
*/
func getArr(arr:[Int] , pre:(Int)->Bool) ->[Int]{
    //定义一个空的可变整形集合
    var tempArr = [Int]()
    for temp in arr {
        if pre(temp){
            tempArr += [temp]
        }
    }
    return tempArr;
}

/****      调用函数       ******/
//定义int数组
var intArr = [0,1,2,3,4,5,6]
/**调用 getArr 函数 ,其中第二个参数为闭包*/
var result = getArr(intArr, pre: {(s:Int)-> Bool in

return s>2

})

print(result)
//[3, 4, 5, 6]

闭包的简化方式:

1,类型推断简化

因为 Swift 可以推断出闭包的参数和返回值类型,所以不需要完整格式构造内联闭包。

上面的闭包就可以简写为:

{s in
    return s>2
}
2,隐藏return 关键字

如果 闭包内只有一条 return 语句时,可以省略return 关键字,所以上面的闭包还可以在简化为:

{s in s>2}

3,参数名缩写

Swift 为内联函数提供了参数名称缩写功能,通过 $0,$1,$2 顺序使用闭包的参数。

如果使用了参数缩写名称,在函数参数列表中可以省略对闭包的定义,Swift 也会推断闭包参数缩写名称的类型。 in 关键字同样被省略。此时闭包表达式完全由闭包函数体构成。上面的闭包再简化为:

{$0 > 2}

使用闭包的返回值:

闭包表达式的运算结果是函数类型,是有返回值的,所以我们可以直接使用它的返回值

var add = { (str1:String,str2:String) -> String in
    return str1+str2
}("hello","word")
print(add)
var add2 = {$0 + $1}("hello","word")
print(add2)
//helloword
//helloword
使用 闭包的返回值,需要在闭包表达式的后面加上小括号(),给闭包传递参数。然后将返回值,赋值给变量add.

尾随闭包

闭包作为函数的参数,而且闭包表达式有很长的情况下,调用函数时,代码的可读性就变的很差,为了增强代码的可读性,这里就需要用到 尾随闭包。就是将闭包写在参数列表括号的后面。

需要注意的是,闭包必须是函数参数列表的最后一个参数。

使用尾随闭包调用上面的 getArr 函数

var result1 = getArr(intArr){(s:Int)-> Bool in return s>2} //尾随闭包
var result2 = getArr(intArr){s in return s>2} //闭包类型推断简化
var result3 = getArr(intArr){s in s>2}  //尾随闭包影藏return
var result4 = getArr(intArr){$0>2} //尾随闭包参数名缩写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值