《iOS移动开发从入门到精通》图书连载18:函数作为参数和返回类型

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

互动教程下载地址:https://itunes.apple.com/cn/app/id1209739676







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李发展

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值