本节书摘来自异步社区《Swift开发实战》一书中的第2章,第2.4节函数和闭包,作者 李宁,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.4 函数和闭包
在本章前面的实例2-1中,testfunc就是一个函数。在Swift语言中,使用关键字func来声明一个函数,使用名字和参数来调用函数,使用“→”来指定函数返回值。例如,如下所示的演示代码。

func greet(name: String, day: String) -> String {return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")

在Swift语言中,使用一个元组来返回多个值。例如,如下所示的演示代码。

func getGasPrices() -> (Double, Double, Double) {return (3.59, 3.69, 3.79)
}
getGasPrices()

在Swift语言中,函数可以带有可变个数的参数,这些参数在函数内表现为数组的形式。例如,如下所示的演示代码。

func sumOf(numbers: Int...) -> Int {var sum = 0for number in numbers {sum += number}return sum
}
sumOf()
sumOf(42, 597, 12)

在Swift语言中,可以使用嵌套函数,被嵌套的函数可以访问外侧函数的变量,也可以使用嵌套函数来重构一个太长或者太复杂的函数。例如,如下所示的演示代码。

func returnFifteen() -> Int {var y = 10func add() {y += 5}add()return y
}
returnFifteen()

在Swift语言中,一个函数可以作为另一个函数的返回值。例如,如下所示的演示代码。

func makeIncrementer() -> (Int -> Int) {func addOne(number: Int) -> Int {return 1 + number}return addOne
}
var increment = makeIncrementer()
increment(7)

在Swift语言中,函数可以当做参数被传入到另一个函数中。例如,如下所示的演示代码。

func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool {for item in list {if condition(item) {return true}}return false
}
func lessThanTen(number: Int) -> Bool {return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)

在Swift语言中,函数实际上是一种特殊的闭包,可以使用“{}”来创建一个匿名闭包。使用关键字“in”将参数和返回值类型声明与闭包函数体进行分离。例如,如下所示的演示代码。

numbers.map({(number: Int) -> Int inlet result = 3 * numberreturn result
})

在Swift语言中,有很多种创建闭包的方法。如果已知一个闭包的类型,比如作为一个回调函数,那么就可以忽略参数的类型和返回值。单个语句闭包会把语句的值当做结果返回。例如,如下所示的演示代码。

numbers.map({ number in 3 * number })

在Swift语言中,可以通过参数位置而不是参数名字来引用参数,这个方法在非常短的闭包中非常有用。当一个闭包作为最后一个参数传给一个函数时,这个闭包可以直接跟在括号后面。例如,如下所示的演示代码。

sort([1, 5, 3, 12, 2]) { $0 > $1 }

《Swift开发实战》——第2章,第2.4节函数和闭包相关推荐

  1. 《Swift开发实战》——第16章,第16.2节下标脚本用法

    本节书摘来自异步社区<Swift开发实战>一书中的第16章,第16.2节下标脚本语法,作者 李宁,更多章节内容可以访问云栖社区"异步社区"公众号查看 16.2 下标脚本 ...

  2. 《Swift开发实战》——第1章,第1.4节启动iOS 8模拟器

    本节书摘来自异步社区<Swift开发实战>一书中的第1章,第1.4节启动iOS 8模拟器,作者 李宁,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.4 启动i ...

  3. 《Swift开发实战》——导读

    本节书摘来自异步社区<Swift开发实战>一书中的目录,作者 李宁,更多章节内容可以访问云栖社区"异步社区"公众号查看 目 录 内容简介 前 言 第1章 工欲善其事,必 ...

  4. Xamarin iOS开发实战第1章使用C#编写第一个iOS应用程序

    Xamarin iOS开发实战第1章使用C#编写第一个iOS应用程序 C#原本是用来编写Windows以及Windows Phone的应用程序.自从Xamarin问世后,C#的作用就发生了很大的变化. ...

  5. 【项目开发实战】第二章——在线商城系统

    系列文章目录 第一章--AI人机对战版五子棋游戏 第二章--在线商城系统 文章目录 系列文章目录 前言 1.项目介绍 2.项目规划分析 2.1 电子商务的简要介绍 2.2 在线博客+商城系统构成模块 ...

  6. DirectX 12 3D游戏开发实战(第一章向量)

    目录 第1章 向量代数 1.1 向量 1.2 长度和单位向量 1.3 点积 1.4 叉积 1.5 点 1.6 利用DirectXMath库进行向量运算 1.7 小结 1.8 练习 第1章 向量代数 向 ...

  7. 《python3网络爬虫开发实战》第一章、开发环境配置-问题汇总

    开发环境: VMware虚拟机 Ubuntu18.04 python3.6 (由于对vi操作水平有限,所以大部分都用的gedit进行文件编辑) 换源: 刚装上系统后换了好几个源,就清华源感觉好使点,别 ...

  8. 组件化开发实战_一篇文章搞懂什么是前端“组件化”开发

    学过网页的朋友都知道,制作一个网页离不开HTML.CSS和JavaScript技术.对于初学者来来说,掌握这3门技术就已经很不容易了,为什么前端为什么又要搞出来一个"组件化"开发的 ...

  9. django web经典模块开发实战——第三章 用Django设计大型电商的类别表

    1 电商类别表的项目功能需求 1.1 使用vue.js在前端开发一个电商导航栏项目 demo1 nodejs的安装 yum install -y nodejs 安装淘宝镜像(贼慢..) npm ins ...

最新文章

  1. js通过正则表达式解析xml 获取指定的内容
  2. 04741计算机网络原理知识点,04741计算机网络原理知识点整理.doc
  3. python学习笔记七
  4. apache 下实现防盗链
  5. linux关闭硬件蜂鸣器,linux 关闭主板上的蜂鸣器声音
  6. 机器学习算法:补一个k-近邻算法的测试
  7. boost::qvm::deduce_vec相关的测试程序
  8. 在 ASP.NET Core 中集成 Skywalking APM
  9. JS基础_强制类型转换-Number
  10. Keil中的Code,RO,RW,ZI分别表示什么?
  11. 字节跳动简历冷却期_【字节跳动招聘】简历这样写,才不会被秒拒
  12. android 3.x,Android Studio3.x的坑(三)
  13. 计算机网络学习笔记(14. OSI参考模型②)
  14. C语言:从键盘输入一些数,求所有正数之和。当输入负数时,程序结束。
  15. 安然数据集分析处理_用自然语言处理分析安然会计丑闻
  16. flex布局文字溢出显示省略号失效的解决方法
  17. 2020年精心收集的十个Java开发网站
  18. 小米扫地机器人 虚拟墙_扫地机器人虚拟墙是什么东西?
  19. C++基础入门(从了解C++到Hello World)
  20. Linux系统学习了解计算机

热门文章

  1. FPGA In/Out Delay Timing Constaint
  2. 交换机端口与mac_address的绑定
  3. hdu(1069)——Monkey and Banana(LIS变形)
  4. 【COCOS2D-X(2.X) 游戏开发系列之一】COCOS2DX(V2.X)与(V1.X)的一些常用函数区别讲解!在2.X版CCFILEDATA类被去除等...
  5. php补充安装扩展支持
  6. iptables 实现地址转换与安全控制
  7. “阿一web标准学堂”选修课:EditPlus高级使用技巧(附视频、课件、代码下载)...
  8. 应用开发也去中心化?基于BCH的筹款平台Akari-Pages与Lighthouse正面交锋
  9. 《圣殿祭司的ASP.NET4.0专家技术手册》---- 1-13 ClientBuilderManager类别的编译功能...
  10. Centos下 安装和测试kafka