Swift4.0复习闭包
1.闭包的定义和调用:
_ = { (param1: Int, param2: Float, param3: Void) -> return_type in
// 闭包执行代码
/* ... */
}
// 这里声明了一个函数类型的引用指向闭包
// 其类型为:(Int, Int) -> () -> Void
let ref = {
(a: Int, b: Int) -> () -> Void in
let sum = a + b
var x = sum *
// 这里在一个闭包内定义了一个嵌套闭包,
// 其参数列表为空,返回类型为Void
return {
() -> Void in
// 在此嵌套闭包中捕获了其外部闭包的sum常量
// 以及x变量
print("x = \(x), sum = \(sum)")
x += sum
}
}
ref(a: 100, b: 200) // x = 600, sum = 300
2.闭包表达式的简略表达:
3.尾随闭包:
“如果一个闭包表达式作为函数调用的最后一个实参,那么我们可以采用尾随闭包(trailing closures)语法糖。当我们采用尾随闭包语法时,如果该函数最后一个形参带有实参标签,那么该实参标签也被省去。”
摘录来自: “大话Swift 4.0”。 iBooks.
func foo(callback: () -> Void) {
callback()
}
// 如果一个函数只有一个形参,并且为函数类型,
// 那么我们在使用尾随闭包时连函数调用操作符也可缺省
foo { print("This is a closure") }
我们看到,如果在一个函数调用最后使用了尾随闭包,这个函数调用看上去十分像一个函数定义。所以我们在读代码的时候需要看所调函数之前有没有关键字 func,如果有 func 说明这是一个函数定义,没有则说明是函数调用。
4.捕获局部变量与闭包的执行上下文:
5.逃逸闭包:
“定义了一个函数,它有一个形参为函数类型,如果在此函数中将通过异步的方式调用该函数引用对象,那么我们需要将此函数类型声明为逃逸的(escaping),以表示该函数类型的形参对象将可能在函数调用操作结束后的某一时刻才会被调用。我们要声明一个函数类型的形参为一个逃逸类型非常简单,只需要在类型前加 @escaping 类型说明符即可。”
摘录来自: “大话Swift 4.0”。 iBooks.
// 这里声明了一个隐式拆解的Optional函数引用对象ref,
// 其初始值为空
var ref: (() -> Void)!
/// 这里定义了一个函数foo,
/// 它仅有一个形参closure
/// - parameter closure: 类型为:@escaping () -> Void
/// 这里如果不加@escaping类型说明符,那么会出现以下编译报错:
/// 将非逃逸的形参'closure'赋值给一个逃逸的闭包
func foo(closure: @escaping () -> Void) {
// 这里仅仅是将形参closure赋值给我们上面定义的ref函数引用对象
ref = closure
}
// 调用foo函数,并给出一个简单的闭包
foo {
print("Hello, world!")
}
// 这里是在调用了foo函数之后再通过ref去调用传递给它的闭包对象
[…]
6.自动闭包:
“如果一个函数的某个形参为函数类型,并且它不含任何形参,那么我们可以将此参数声明为自动闭包(autoclosure)。如果要将一个形参声明为自动闭包,那么在该形参的类型前加 @autoclosure 类型说明符即可。当一个形参作为一个自动闭包时,我们在调用该函数所传入的实参只需要一个表达式即可,Swift编译器会自动将它封装为一个闭包表达式。”
摘录来自: “大话Swift 4.0”。 iBooks.
// 这里再次定义了函数foo,
// 将它的函数类型的形参声明为自动闭包
func foo(auto closure: @autoclosure () -> Void) {
closure()
}
// 我们看到,这里对foo调用时,
// 形参直接就传入了一个函数调用表达式
foo(auto: print("This is a simple lambda!"))
Swift4.0复习闭包的更多相关文章
- Swift4.0复习特性、编译标志和检查API的可用性
1.Swift中的特性: @引出,后面紧跟特性名,圆括号带参数即可. @attribute(args) avaiable: 指明对象,函数,类型的可用性. @available(iOS 10.0, m ...
- Swift4.0复习控制流语句
1.do语句块: Swift编程语言中可使用 do 语句块作为类似C语言中的一般语句块进行使用.与C语言的语句块类似,Swift中的 do 语句块单独作为一个作用域,该语句块中声明的局部对象在其外部将 ...
- Swift4.0复习访问控制与作用域
1.访问等级: open: 可以继承,可以重写. public: “public 访问等级能用于修饰所有文件作用域的函数.对象.协议.枚举.结构体.类以及各种类型中的属性与方法.用 public 所修 ...
- Swift4.0复习错误处理
1.Swift中错误的表示: “在Swift中如果我们要定义一个表示错误的类型非常简单,只需遵循 Error 协议即可.我们通常用枚举或结构体类型来表示错误类型,当然枚举可能用得更多些,因为它能更直观 ...
- Swift4.0复习扩展
1.扩展计算式属性: 2.对方法进行扩展: /// 定义枚举类型Light, /// 它指定了基本类型String enum Light: String { case red = "red& ...
- Swift4.0复习类型定义、类型投射等操作
1.类型定义: /// 这里将MyInt定义为Int32类型 typealias MyInt = Int32 /// 这里将MyArrayInt定义为[MyInt]数组类型 typealias M ...
- Swift4.0复习类
1.类的属性: 2.类的方法: 3.类作为引用类型: “Swift新增了一对操作符 === 与 !== 用于判定同一个类的两个对象引用是否指向同一对象实例.” 摘录来自: “大话Swift 4.0”. ...
- Swift4.0复习协议
1.协议的定义: /// 定义一个协议MyProt protocol MyProt { /// 声明了一个实例方法foo, /// 其类型为:() -> Void func foo() ...
- Swift4.0复习结构体
1.基本语法: /** 定义了一个结构体 */ struct Structure { /// 一个常量存储式实例属性, /// 并直接为它初始化 let constProperty = /// ...
随机推荐
- 洛谷 AT2434 JOI 公園 (JOI Park) 题解
人生第一次AC黑题,我太感动了. 每日一题 day31 打卡 Analysis 先跑遍DJ,求出1到 i的最短路.得到每个点到 1号点的距离后,从小到大排序一遍,这时便可以枚举每个点到 1号点的距离修 ...
- PHP命令行执行文件或代码
Linux环境 1.执行代码 php -r "echo 'hello';" (注意加分号,与PHP文件一样) 2.执行文件 php -f 文件所在路径(/var/www/xxx. ...
- php使用WebUploader做大文件的分块和断点续传
核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...
- 【EF】vs2017中没有EF模型
在添加->新建项目 中找不到实体模型? 或者 在vs中打开edmx文件时,显示的只有文本,没有图形模式 原因:是因为没有安装实体模型插件 解决方法: 1.打开网址 https://marketp ...
- 洛谷 P1191 矩形 题解
P1191 矩形 题目描述 给出一个 \(n \times n\)的矩阵,矩阵中,有些格子被染成白色,有些格子被染成黑色,现要求矩阵中白色矩形的数量 输入格式 第一行,一个整数\(n\),表示矩形的大 ...
- Android精通教程-Android入门简介
前言 大家好,我是 Vic,今天给大家带来Android精通教程-Android入门简介的概述,希望你们喜欢 每日一句 If life were predictable it would cease ...
- Multi-Temporal SAR Data Large-Scale Crop Mapping Based on U-Net Model(利用U-net对多时相SAR影像获得作物图)
对哨兵1号的多时相双极化SAR数据进行预处理,得到18个日期的VV和VH共36景影像,通过ANOVA和JM距离分析,选其中ANOVA得到的F值最高的6景影像.真值用LC8数据和地面调查,目视解译得到标 ...
- jenkins之SSH Publishers环境变量
我使用的是docker部署jenkins,使用172.16.1.245作为部署服务器. 1.问题 在SSH Publishers里执行的环境变量,不是ssh server主机设置的环境变量,这样会导致 ...
- 开源GIT仓库-----gitlab
简介:GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能,能够浏览源代码 ...
- 对okhttp参数的一些思考
背景 项目中使用OkHttp访问三方服务 参数 创建okhttp客户端类的时候需要设置一些参数,有些可能是坑,仅供参考: client = new OkHttpClient.Builder() .di ...