在第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