【Swift4】(6) 闭包 | 闭包应用 | 闭包作为函数参数 | 捕获特性

⭐️ 本文首发自 前端修罗场(点击加入),是一个由 资深开发者 独立运行 的专业技术社区,我专注 Web 技术、Web3、区块链、答疑解惑、面试辅导以及职业发展博主创作的 《前端面试复习笔记》(点击订阅),广受好评,已帮助多人提升实力、拿到 offer。现在订阅,私聊我即可获取一次免费的模拟面试机会,帮你评估知识点的掌握程度,获得更全面的学习指导意见!

闭包 Closure

闭包的基本使用与简写

  • 语法优化
var myClosure:() -> Void = {
    print("Hello world")
}

myClosure()

var mySecondClosure:(Int,Int) -> Int = {
    (a:Int,b:Int) -> Int in //闭包标准写法
    return a*b
}

mySecondClosure = {
    (a,b) in //闭包简写,类型自动推导 可以根据参数推断
    return a*b
}

mySecondClosure = {
    (a,b) in //进一步闭包简写,如果函数体只包含一句 return 代码,可省略 return
    a*b
}
mySecondClosure = {
    $0 * $1 
//再简写:被捕获的参数列表中,含有a、b,下标从0开始,可通过"$"获取。省略参数列表 (a, b)和 关键字 in
}

闭包应用

  • 排序
var arr:[Int] = [1,3,5,6,7,2,4,6,8]

arr.sorted() //[1, 2, 3, 4, 5, 6, 6, 7, 8]

arr.sorted {
    $0 > $1  //[8, 7, 6, 6, 5, 4, 3, 2, 1]
}
var arr = [0,1,2,3,4,5,6,7,8,9,10]
arr.sorted {
    return fabs(Float($0-5)) < fabs(Float($1-5))  //离5越近排在越前面 [5, 4, 6, 3, 7, 2, 8, 1, 9, 0, 10]
}
  • 遍历
//forEach
var arr2 = [5,6,7,8,9]

arr2.forEach {
    print("\($0)")  //[5, 6, 7, 8, 9]
}

var arr3 = [1,2,3,4]
//filter
arr3.filter {
    return $0 > 3   //[4]
}

var arr4 = ["0","1","imagine"]
//map
var num = arr4.map {
    Int($0) //[0, 1, nil] 类型转换可能失败,所以返回的是可选型
}
var num2 = arr4.compactMap {
    Int($0) //[0, 1] //compactMap : 解包->展开并合并
}
//reduce
var arr5 = [0,1,2]

var sum = arr5.reduce(0) {
    return $0 + $1  //3
}

闭包作为函数参数

func handler(_ a: Int, _ b: Int,operation:(Int,Int)->Int) ->Int {
    let res = operation(a,b)
    return res
}

let multipyClosure = { //实现一个闭包
    (a:Int,b:Int) in
    a * b
}

handler(2, 3, operation: multipyClosure) //将闭包作为参数传递

捕获

闭包可以从上下文环境中捕获常量、变量,并在自己的作用域内使用。

//捕获
var num = 3
arr.sorted {
    return fabs(Float($0-num)) < fabs(Float($1-num))  //向外层找变量 num
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程轨迹_

期望和你分享一杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值