《iOS移动开发从入门到精通》图书连载17:函数的定义和调用

本文深入探讨了Swift 3.0中的函数定义与使用,包括函数的基本概念、参数设置、默认值及可变参数等内容,并通过实例展示了如何在实际编程中应用这些特性。

在第3章为大家揭开了Swift 3.0语言的神秘面纱,并为大家讲解了Swift 3.0基本的语法知识。

本章将继续围绕Swift 3.0讲解一些更加深层次的知识。我们将谈到函数、枚举、结构体、类、扩展、协议等干货内容,同时还为大家详细解释了问号?和感叹号!在编码中的用途以及使用方法。


4.1.1函数的定义和调用

函数是一个组织在一起的程序代码集合,以完成某个特定的功能。为了提高代码的复用性。通常对代码进行抽取,将能够完成同一个任务的代码,放置在一起,作为一个函数使用。同时给定函数一个名称标识, 当执行其任务时,就可以用这个标识来进行函数的调用。

Swift使用关键字func进行函数的定义。当定义一个函数时,您可以为其定义一个或多个不同名称、类型的值,作为函数的输入参数。当该函数完成时,将返回输出定义的类型。

每个函数都有一个函数名来描述它的功能。通过函数名以及对应类型的参数值,来调用这个函数。函数的参数传递的顺序,必须与参数列表中的顺序相同。

 

函数定义的格式如下所示:

func 函数名(参数变量:类型,参数变量:类型...) -> 返回类型
{
   程序语句
   程序语句
   ……
  return 结果  
}

 

在下面的代码中,我们定义了一个无参并且无返回类型的函数:

        func sayHelloSwift()
        {
            print("Hello, Swift!")
        }

 

函数定义之后,我们可以通过函数名,以及对应类型的参数值来调用函数,函数的参数传递的顺序,必须与参数列表相同。由于sayHelloSwift函数,是一个无参函数,所以您可以直接使用函数的名称,以调用该函数:

        sayHelloSwift()
 
//sayHelloSwift函数极有简单,当调用该函数后,将在控制台输出"Hello, Swift!"信息。


在下面的代码中,我们定义了拥有两个参数和返回值的函数。所有的参数都被放置在函数名称右侧的小括号内。您指定的函数的返回类型,是以箭头->(一个连字符后跟一个右尖括号),以及随后类型的名称作为函数的返回类型:

        func sum(number1:Int,number2:Int)->Int
        {
            return number1 + number2
        }


当调用包含参数的函数时,您需要在函数名称内,传递相同数量的参数。sum函数是通过用户传递两个整数,从而获得两个整数之和,所以在调用该函数时,需要传递两个整数作为函数的参数。函数执行完毕后,通过result1和result2分别获得两次执行的结果,并在控制台打印输出函数执行的结果:

        let result1 = sum(1, number2:1)
        print(result1)                                          //输出结果:2
        let result2 = sum(2, number2:2)
        print(result2)                                          //输出结果:4


4.1.2 为参数设置默认值

在Swift环境中,您可以为函数的参数设置默认值。

例如,您在游戏中,需要计算屏幕中的各个敌人距离炮塔的位置,以确定距离是否近到可以引起炮塔的攻击。由于炮塔的位置是固定的,所以可以将该参数值设置为默认值:

        func getDistance(enemyPosition:CGPoint,turretPosition: CGPoint=CGPoint(x: 100, y: 100))->CGFloat
        {
            let xDis = turretPosition.x -enemyPosition.x
            let yDis = turretPosition.y -enemyPosition.y
            return sqrt(xDis*xDis + yDis*yDis)
        }


在getDistance方法的参数声明区域,当添加第二个参数时,在参数类型的右侧添加了一个等号,以及等号后面的默认参数值。当调用该方法时,只需要传入第一个参数即可:

        let enemyPosition = CGPoint(x:200, y: 200)
        let distance =getDistance(enemyPosition: enemyPosition)
        print(distance)                    //输出结果为:141.4213562373095
 

如果游戏场景中拥有多个炮塔,您仍然可以使用getDistance函数,只需在调用该函数时,填写上第二个参数即可:

        let enemyPosition = CGPoint(x:200, y: 200)
        let anotherTurrentPosition = CGPoint(x:100, y: 400)
        let distance = getDistance(enemyPosition:enemyPosition, turretPosition: anotherTurrentPosition)
        print(distance)                    //输出结果为:223.606797749979


4.1.3 设置可变的函数参数数量

在定义函数时,如果您不确定参数的数量,通过在变量类型后面加 (...) ,以定义可变参数。一个函数最多能有一个可变参数,且必须是函数表中最后的一个。为避免在调用函数时引起歧义,一个函数如果有一个或多个参数,并且还有一个可变参数,一定要把可变参数放在最后:

        func getAverage(numbers:Double...) -> Double
        {
            if numbers.count == 0
            {
                return 0.0
            }
            var total: Double = 0
            for number in numbers
            {
             total += number
         }
         return total / Double(numbers.count)
       }

 

在第一行代码中,创建了一个名为getAverage的函数,用来求取一批浮点数据的平均值。通过将其参数设置为Double...类型,从而设定函数的参数为属于Double类型的、数量不定的浮点数。

在第3至6行的代码中,进行了安全的判断,以避免用户在调用函数时,没有输入任何的参数,从而产生被零除的错误。

在第8至11行的代码中,通过for-in语句,遍历并汇总用户输入的所有浮点参数,并将汇总结果存储在total变量中。

最后在第12行代码中,求取并返回所有参数的平均值。

当用户调用该函数,并且在函数中未提供任何参数的情况下,可以得到如下的结果:

     let average = getAverage()
     print(average)                       //输出结果为:0
 


当用户调用该函数,并且在函数中输入一定数量的参数时,可以得到如下的结果:

     let average = getAverage (numbers:1,2,3,4,5,6)
     print(average)                       //输出结果为:3.5



新 作

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、付费专栏及课程。

余额充值