iOS开发Swift-闭包

1.闭包表达式语法

复制代码
{ (参数) -> return 类型 in
    //内容
}

let names = ["C", "A", "E", "B", "D"]
func back(_ s1: String, s2: String) -> Bool {
    return s1 > s2   //(B > A, C > B)
}
//闭包后:
var reversedNames.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})

2.根据上下文推断类型

复制代码
reversedNames = names.sorted(by: {s1, s2 in return s1 > s2})
//传入参数的类型确定,: String, : String可省略。传出参数的类型确定: -> Bool可省略

3.单表达式闭包的隐式返回

复制代码
reversedNames = names.sorted(by: {s1, s2 in s1 > s2})
//只包含一个表达式,省略return之后无歧义,所以可以省略return。

4.参数名称缩写

复制代码
reversedNames = names.sorted(by: {$0 > $1})
//可按照$0, $1, $2顺序调用闭包函数

5.运算符方法

复制代码
reversedNames = names.sorted(by: >)

6.尾随闭包

将很长的闭包表达式作为最后一个参数传递给函数,不用写出他的参数标签。

复制代码
func some(do: () -> Void) {
    //代码
}
//不使用尾随闭包调用函数
some(do: {
    //代码
}
//使用尾随闭包调用函数
some() {
    //语句
}

reversedNames = names.sorted() {$0 > $1}
//sorted为函数的唯一方法时,可省略括号
reversedNames = names.sorted {$0 > $1}

7.值捕获

嵌套函数可捕获其外部函数所有参数、变量、常量。

8.逃逸闭包

当一个闭包作为一个参数传到一个函数中,但闭包在函数返回之后才被执行,则称闭包逃逸。

标注@escaping,表示允许闭包逃逸。

复制代码
var comp: [() -> Void] = []
func some(comp1: @escaping () -> Void) {
    comp.append(comp1)
}

9.自动闭包

包装传递给函数作为参数的表达式。不接受参数,只返回值。

延迟求值。直到调用这个闭包,代码才被执行。

复制代码
var cuL = ["C", "A", "E", "B", "D"]
print(cuL.count)    //5
let cuP = {cuL.remove(at: 0)}
print(cuL.count)    //5。闭包未运行
cuP()     //调用闭包
print(cuL.count)    //4。闭包已运行,第一个值被删除。
相关推荐
柱子子子子25 分钟前
Ubuntu24.04 不能使用todesk 解决办法
运维·服务器
霜绛40 分钟前
C#知识补充(一)——ref和out、成员属性、万物之父和装箱拆箱、抽象类和抽象方法、接口
开发语言·笔记·学习·c#
天若有情6731 小时前
新闻通稿 | 软件产业迈入“智能重构”新纪元:自主进化、人机共生与责任挑战并存
服务器·前端·后端·重构·开发·资讯·新闻
T.Ree.1 小时前
cpp_list
开发语言·数据结构·c++·list
BJ_Bonree1 小时前
圆桌论坛精华实录 | AI是重构运维逻辑的颠覆性革命?博睿数据与行业大咖亲授“AI+可观测性”的破局之道
运维·人工智能·重构
laocooon5238578861 小时前
C++ 图片加背景音乐的处理
开发语言·c++
爱编程的鱼1 小时前
C# var 关键字详解:从入门到精通
开发语言·c#·solr
MATLAB代码顾问1 小时前
MATLAB实现TCN神经网络数值预测
开发语言·matlab
冬夜戏雪1 小时前
【尚庭公寓152-157】[第6天]【配置阿里云号码认证服务】
运维·服务器
恋上钢琴的虫1 小时前
openEuler上安装高版本的docker
运维·docker·容器