《从零开始学Swift》学习笔记(Day 22)——闭包那些事儿!

简介: <div style="top: 0px;"></div><span style="font-family:宋体;font-size:14px;"></span><p style="margin: 0cm 0cm 0pt; mso-outline-level: 1;"><span style="font-size:14px;"><span style="font-family:宋体;ms


原创文章,欢迎转载。转载请注明:关东升的博客

 

我给Swift 中的闭包一个定义:闭包是自包含的匿名函数代码块,可以作为表达式、函数参数和函数返回值,闭包表达式的运算结果是一种函数类型。

Swift中的闭包类似于Objective-C中的代码块、Java中的匿名内部类。

 

使用闭包表达式

Swift中的闭包表达式很灵活,其标准语法格式如下:

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

    语句组

}

其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是后面有in关键字。

Swift提供了多种闭包简化写法,我来介绍下面几种不同形式:

 

1、类型推断简化

类型推断是Swift的强项,Swift可以根据上下文环境推断出参数类型和返回值类型。以下代码是标准形式的闭包:

{(a:Int, b:Int) -> Intin

    return a + b

}

Swift能推断出参数abInt类型,返回值也是Int类型。简化形式如下:

{(a, b) in return a + b }

{a, b in return a + b }  //参数列表括号也可以省略

 

2、隐藏return关键字

在闭包内部语句组只有一条语句,如return a + b等,那么这种语句都是返回语句。前面的关键字return可以省略,省略形式如下:

{a, b in a + b }

使用这种简化方式修改后的示例代码如下:

func calculate(opr :String)-> (Int,Int)-> Int {




    var result : (Int,Int)-> Int

    

    switch (opr) {

    case "+" :

        result = {a, b in a + b } //return关键字省略了

    default:

        result = {a, b in a - b } //return关键字省略了

    }

    return result

}

省略的前提是闭包中只有一条return语句。

 

3、省略参数名称

Swift提供了参数名省略功能,我们可以用$0$1$2…来指定闭包中参数,$0指代第一个参数,$1指代第二个参数,$2指代第三个参数,以此类推$n+1指代第n个参数。

使用参数名省略功能,在闭包中必须省略参数列表定义,Swift能够推断出这些缩写参数的类型。参数列表省略了,in关键字也需要省略。参数名省略之后如下所示:

{$0 + $1}

使用参数名省略后的示例代码如下:

func calculate(opr :String)-> (Int,Int)-> Int {

 

    var result : (Int,Int)-> Int

    

    switch (opr) {

    case "+" :

        result = {$0 + $1} //采用了参数名省略

    default:

        result = {$0 - $1} //采用了参数名省略

    }

    return result

}

 

let f1:(Int,Int)-> Int = calculate("+")

print("10 + 5 = \(f1(10,5))")

 

let f2:(Int,Int)-> Int = calculate("-")

print("10 - 5 = \(f2(10,5))")

 

4、使用闭包返回值

闭包表达本质上是函数类型,是有返回值的,我们可以直接在表达式中使用闭包的返回值。重新修改addsub闭包,示例代码如下:

let c1:Int = {(a:Int, b:Int) -> Int in

                 return a + b

               }(10,5)   

 

print("10 + 5 = \(c1)")

 

解释:给c1赋值,后面是一个闭包表达式。但是闭包表达式不能直接赋值给c1,因为c1Int类型,需要闭包的返回值。这就需要在闭包结尾的大括号后面接一对小括号(10,5),通过小括号(10,5)为闭包传递参数。

 

 

欢迎关注关东升新浪微博@tony_关东升。
关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
 

更多精品iOSCocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com
智捷课堂论坛网站:http://51work6.com/forum.php

 

目录
相关文章
|
4月前
|
存储 Swift
Swift 语言:什么是闭包(Closure)?它们与函数的区别是什么?
Swift 语言:什么是闭包(Closure)?它们与函数的区别是什么?
39 1
|
5月前
|
存储 Swift
Swift中,函数和闭包
Swift中,函数和闭包
34 1
|
7月前
|
Swift
swift 闭包简写实际参数名$0、$1等理解
swift 闭包简写实际参数名$0、$1等理解
31 0
|
存储 编译器 开发者
Swift-进阶 09:闭包(二)逃逸闭包 & 非逃逸闭包
Swift-进阶 09:闭包(二)逃逸闭包 & 非逃逸闭包
452 0
Swift-进阶 09:闭包(二)逃逸闭包 & 非逃逸闭包
|
存储 Swift C++
Swift-进阶 09:闭包(一)使用&捕获原理
Swift-进阶 09:闭包(一)使用&捕获原理
435 0
Swift-进阶 09:闭包(一)使用&捕获原理
|
存储 编译器 Swift
Swift - 闭包捕获值原理分析
先说原理本质: 编译器在堆上开辟空间,存放了捕获的值
Swift - 闭包捕获值原理分析
|
Swift
Swift学习笔记——页面跳转
创建一个single view app后,项目中有main.storyboard,里面是一个viewcontroller。 那么我们如何实现页面跳转 首先添加一个导航控制器Navigation Controller。点击右上的➕,然后选择控件拖到面板上即可
1151 0
|
前端开发 测试技术 Swift
Swift学习笔记——新建项目
在xcode菜单中选择 new -> project -> single view app 点击next在弹出窗中填写项目名称 这里languge有可以选择object-c或swift作为项目语言。这里我们学习swift,所以选择swift。 如果language选择swift,下面的user interface可以选择swiftUI和storyboard。 SwiftUI是2019 年 WWDC 大会上,苹果在压轴环节向大众宣布了基于 Swift 语言构建的全新 UI 框架,与flutter类似,是用代码编写页面,支持快速预览。
669 0
|
API Swift 开发者
Swift3.0带来的变化汇总系列三——函数和闭包写法上的微调
Swift3.0带来的变化汇总系列三——函数和闭包写法上的微调
89 0
|
算法 搜索推荐 编译器
Swift讲解专题八——闭包
Swift讲解专题八——闭包
145 0