《iOS移动开发从入门到精通》图书连载18:函数作为参数和返回类型
来源:互联网 发布:淘宝网官方网站登入 编辑:程序博客网 时间:2024/06/11 15:56
4.1.4函数作为参数和返回类型
Swift中的每个函数都有一个类型,包括函数的参数类型和返回类型。您可以方便的使用此类型,像任何其他类型一样。
函数作为参数
这使得它很容易将函数作为参数,传递给其它的函数。甚至从函数中返回函数类型。
func getSmaller (number1:Int,number2:Int) -> Int { return ((number1 < number2) ? number1 :number2) } func getBigger (number1:Int,number2:Int) -> Int { return ((number1 > number2) ? number1 :number2) } funcprintMathResult(mathFunction: (Int, Int)->Int, num1:Int, num2:Int) { print("The result is:\(mathFunction(num1, num2))") }
在第1至4行代码中,创建了一个名为getSmaller函数,它包含两个整型参数,主要功能是用来获得两个参数中的较小的值。
在第5至8行代码中,创建了一个名为getBigger函数,它也包含两个整型参数,主要功能是用来获得两个参数中的较大的值。
在第9至12行代码中,创建了一个名为getMathResult函数,它拥有三个参数。其中第一个参数的类型为:(Int, Int)->Int,即拥有两个整型参数,并且返回整型结果的函数类型。另外两个参数为两个整型数值。该函数功能是通过传入的第一个参数,来决定使用getSmaller函数,还是使用getBigger函数,对后面的两个整型参数进行处理。
接着调用printMathResult函数,并且分别在该函数中,传入getSmaller和getBigger函数:
printMathResult(mathFunction:getSmaller, num1: 1, num2: 2) printMathResult(mathFunction: getBigger,num1: 1, num2: 2)
以上代码分别求出了两个参数中的最小值和最大值,最终的输出结果如下:
12
函数作为返回类型
一个函数除了可被作为另一个函数的参数使用,同时也可以作为其它函数的返回类型。在下面的代码中,通过将函数作为另一个函数的返回类型,实现了与上一个例子同样的功能:
func getSmaller(number1:Int,number2:Int) -> Int { return ((number1 < number2) ? number1 :number2) } func getBigger(number1:Int,number2:Int) -> Int { return ((number1 > number2) ? number1 :number2) } func chooseFunction(needBigger:Bool) -> (Int, Int) -> Int { return needBigger ? getBigger : getSmaller } let function = chooseFunction(needBigger:true) print(function(2, 3)) //输出结果为:3
和前一个示例一样,在第1至4行代码中,创建了一个getSmaller函数,它包含两个整型参数,主要功能是用来获得两个参数中的较小的值。
在第5至8行代码中,创建了一个getBigger函数,它也包含两个整型参数,主要功能是用来获得两个参数中的较大的值。
接着在第9至12行的代码中,定义了一个名为chooseFunction的函数,它包含一个布尔类型的参数needBigger,从而由用户来选择使用getBigger和getSmaller两个函数中的哪个。如果needBigger参数为ture,则使用getBigger函数,以获得较大的值,反之则使用getSmaller函数,以获得两个参数中较小的值。
在第13代码中,定义了一个常量function,并根据传入chooseFunction函数的参数值true,将getBigger函数,赋予function常量。因此function常量将具有获得两个参数较大者的功能。
4.1.5 元组作为函数的返回类型,实现多个返回值
您在日常的开发工作中,可能会遇到这样的场景。当用户通过用户名(一般为邮箱或手机号)和密码登陆系统后,需要从服务器获取用户的姓名、用户级别和头像信息。对于像这样的需要同时返回多条信息的函数,您可以使用元组来组织函数返回的所有内容:
func getUserInfo(userId:String)-> (userName: String, userLevel: Int, photoPath: String) { let userName = "John" let userLevel = 3 let photoPath = "http://www.coolketang.com/userPhoto/323sfa4.png" return (userName, userLevel, photoPath) }
在第一行的代码中,定义了一个名为getUserInfo的函数,其包含一个参数userId,通过该参数,从服务器查询指定用户的属性信息。并设置返回类型为:(String,Int, String),分别存储用户的姓名、级别和头像路径等信息。
接着在第3至7行代码中,定义了用户的三个属性信息,并将三个属性组成一个元组,最后使用return语句,在函数的结尾返回包含用户属性的元组。
服务器以元组的形式返回用户属性信息后,在控制台打印输出元组的信息即可:
let message = getUserInfo(userId:"2341") print(message.0) //输出结果为:John print(message.1) //输出结果为:3 print(message.2) //输出结果为:http://www.coolketang.com/userPhoto/323sfa4.png
4.1.6使用函数类型
使用函数类型就跟使用其他的类型一样。比如可以定义一个常量或变量,其类型就是函数,而且可以给这个函数赋值。
这里首先定义一个普通的函数,它包含两个整型参数,然后计算并返回两个参数之和:
func getTotal(num1:Int,num2:Int) -> Int { return num1 + num2 }
接着定义一个newFunction的变量,其类型是两个整型参数并返回整型的函数,并让这个变量指向getTotal函数
let newFunction: (Int, Int)-> Int = getTotal let result = newFunction(1, 1) print(result) //输出结果为:2
在给使用函数类型定义变量时,可以省略函数类型的书写:
let anotherFunction = getTotal let result2 = anotherFunction(num1:1, num2: 2) print(result2) //输出结果为:3
那么如何使用无参并且无返回值的函数类型呢?首先定义一个此类型的函数:
func printHelloSwifth() { print("Hello, Swift!") }
printHelloSwifth函数没有包含任何的参数,也没有任何的返回值。当需要定义该函数类型的常量或变量时,可以使用以下方式:
let anotherGreating : ()->()= printHelloSwifth anotherGreating() //输出结果为:Hello, Swift!
4.1.7 函数的输入输出参数
在冒泡排序算法中,需要比较相邻的两个数字的大小。例如需要对一个数组中的数字进行升序排列,如果前面的数字比后面相邻的数字较大,则需要交换两个数字在数组中的位置。
您可以创建一个拥有两个参数的函数swap,来实现相邻数字之前的互换操作。
如果想要一个函数可以修改参数的值,并且这些修改在函数结束调用后仍然存在,那就可以将参数定义为输入输出参数,这可以通过在参数类型的前面添加inout关键字来实现。
同时,传入函数的参数,只能是变量而不能是常量,当传入的参数作为输入输出参数时,需要在参数面前加上&符号,表示这个参数值是可以被修改的:
func swap(prevNumber: inout Double,nextNumber: inout Double) { let tempNumber = prevNumber prevNumber = nextNumber nextNumber = tempNumber }
在第1行的代码中,定义了一个名为swap的函数,该函数拥有两个参数,参数类型的左侧都拥有inout关键字,表示两个参数都是输入输出参数。
接着第3行至第5行的代码中,通过创建一个临时常量tempNumber,交换两个输入输出参数prevNumber和nextNumber的值。
在调用swap函数时,需要注意它的两个参数必须为变量类型,并且系统会自动在两个变量的左侧添加&符号:
var preNumber = 2 var nextNumber = 1 swap(&preNumber,&nextNumber) print(preNumber) //输出结果为:1 print(nextNumber) //输出结果为:2
新 作
iOS开发中的神兵利器
共140节课程,讲解GitHub中近百个过千star的iOS热门开源项目
市面上唯一大规模讲解GitHub中热门的iOS开源项目的教程
快速、优雅地解决iOS开发工作中遇到的各种棘手问题
视频观看地址:http://study.163.com/course/courseMain.htm?courseId=1003657013
互动教程下载地址:https://itunes.apple.com/cn/app/id1209739676
新 作
iOS开发中的神兵利器
共140节课程,讲解GitHub中近百个过千star的iOS热门开源项目
市面上唯一大规模讲解GitHub中热门的iOS开源项目的教程
快速、优雅地解决iOS开发工作中遇到的各种棘手问题
视频观看地址:http://study.163.com/course/courseMain.htm?courseId=1003657013
互动教程下载地址:https://itunes.apple.com/cn/app/id1209739676
- 《iOS移动开发从入门到精通》图书连载18:函数作为参数和返回类型
- 《iOS移动开发从入门到精通》图书连载17:函数的定义和调用
- 《iOS移动开发从入门到精通》图书连载19:函数的嵌套
- 《iOS移动开发从入门到精通》图书连载11:字符和字符串
- 《iOS移动开发从入门到精通》图书连载2:如何成为一名iOS开发者
- 《iOS移动开发从入门到精通》图书连载4:iOS应用的生命周期
- 《iOS移动开发从入门到精通》图书连载7:iOS模拟器的使用
- 《iOS移动开发从入门到精通》图书连载12:元组类型、一元、二元和三元运算符、 比较运算符
- 《iOS移动开发从入门到精通》图书连载5:Xcode 8的使用(上)
- 《iOS移动开发从入门到精通》图书连载8:Swift的基本概念(上)
- 《iOS移动开发从入门到精通》图书连载9:Swift的基本概念(下)
- 《iOS移动开发从入门到精通》图书连载15:数组
- 《iOS移动开发从入门到精通》图书连载16:字典
- 《iOS移动开发从入门到精通》图书连载20:枚举
- 《iOS移动开发从入门到精通》图书连载10:布尔类型、Int类型及实例属性、浮点类型及实例属性
- 《iOS移动开发从入门到精通》图书连载3:如何创建一个基本的iOS项目?
- 《iOS移动开发从入门到精通》图书连载6——Xcode8的使用(下)
- 《iOS移动开发从入门到精通》图书连载13:for循环、while循环语句、repeat-while循环语句
- Java有哪12要素和其他因素?
- 一文看懂大数据的技术生态圈,Hadoop,hive,spark都有了
- iOS开发笔记之五十六——Geofencing地理围栏技术介绍
- Android开发艺术探索(连载)之View的事件体系(二)View的滑动
- nyoj123——士兵杀敌(四)
- 《iOS移动开发从入门到精通》图书连载18:函数作为参数和返回类型
- android中华为、小米手机设置头像裁剪失败问题
- BZOJ 1053: [HAOI2007]反素数ant 数论,DFS
- Android 6.0新特性之Doze模式
- Android Activity的启动和跳转
- 一些贪心算法的盲区
- 前端实战实用笔记
- appium自动化测试环境搭建
- c#第一,二章总结