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)
以上代码分别求出了两个参数中的最小值和最大值,最终的输出结果如下:
1
2
函数作为返回类型
一个函数除了可被作为另一个函数的参数使用,同时也可以作为其它函数的返回类型。在下面的代码中,通过将函数作为另一个函数的返回类型,实现了与上一个例子同样的功能:
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
新 作
iOS开发中的神兵利器
共140节课程,讲解GitHub中近百个过千star的iOS热门开源项目
市面上唯一大规模讲解GitHub中热门的iOS开源项目的教程
快速、优雅地解决iOS开发工作中遇到的各种棘手问题
视频观看地址:http://study.163.com/course/courseMain.htm?courseId=1003657013