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 = /// ...
随机推荐
- java.util.Properties 读取配置文件中的参数
用法 getProperty方法的返回值是String类型. java.util.Properties 读取配置文件中的参数 //读取配置文件 FileInputStream inStream = n ...
- C++ error C2015: too many characters in constant
错误原因:字符常量中的字符太多了. 错误分析: 单引号表示字符型常量. 一般的,单引号中必须有,也只能有一个字符(使用转义符时,转义符所表示的字符当作一个字符看待),如果单引号中的字符数多于4个,就会 ...
- GDB十分钟教程【转载于网络爱好者】
本文写给主要工作在Windows操作系统下而又需要开发一些跨平台软件的程序员朋友,以及程序爱好者. GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调 ...
- Codevs 1070 普通递归关系(矩阵乘法)
1070 普通递归关系 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 考虑以下定义在非负整数n上的递归关系 f(n) = f0 ...
- react 通过 xlink 方式引用 iconfont
项目中采用 xlink 的方式引用 iconfont 文件,在正常的 html 文件中可以正常引用,但是在 react 下确不可以运行. 经过查找,发现需要更改如下 引入的属性默认为 xlink-hr ...
- 利用nc当作备用shell管理方案.
ssh 有时候真的就是连不上了,然后是没什么然后了呢. 或者手残改错配置然后重新sshd了. 所以这时候需要备用的远程管理工具.nc是最好的选择,一般服务器都是 内网的,如果跳板机也管理不了呢. 安装 ...
- leaflet常用插件库
1.常用地图切换加载(osm.google.baidu.gaode.tianditu.etc)https://github.com/htoooth/Leaflet.ChineseTmsProvider ...
- 利用Wireshark抓取并分析OpenFlow协议报文
OpenFlow 交换机与控制器交互步骤 1. 利用Mininet仿真平台构建如下图所示的网络拓扑,配置主机h1和h2的IP地址(h1:10.0.0.1,h2:10.0.0.2),测试两台主机之间的网 ...
- Python常量类
class _const: class ConstError(TypeError): pass class ConstCaseError(ConstError): pass def __setattr ...
- JVM相关文章和GC原理算法
参考推荐: Java内存模型及GC原理 一个优秀的Java程序员必须了解的GC机制 Android 智能指针原理(推荐) Java虚拟机规范 Java虚拟机参数 Java内存模型 Java系列教程(推 ...