更新:2018.05.24
整理了一下demo:SwiftDemo
- 函数是一个组织在一起的程序代码集合,用来完成某一个特定的功能。
- Swift使用关键字`func进行函数的定义。
- 定义一个函数时,可以定义一个或多个不同名称、类型的值,作为函数的输入参数。当函数完成是,将返回出书定义的类型。
- 每个函数都有一个函数名来描述它的功能。通过函数名以及对应类型的参数值,可以调用这个函数,函数的参数传递顺序必须与参数列表中的顺序相同。
函数格式如下:
func 函数名(参数变量: 类型, 参数变量: 类型) -> 返回类型 {
}
- 没有参数也没有返回值
func buildSubviews() {
}
- 有参数没有返回值
func tableView(tableView: UITableView) {
}
- 没有参数有返回值
func buildHeaderView() -> UIView {
}
- 有参数有返回值
func sum(num1: Int, num2: Int) -> Int {
}
当调用包含多个参数的函数时,必须要传递形同数量的参数。
为参数设置默认值
- Swfit中,可以为函数的参数设置默认值。
func sum (x:Int = 1, y:Int = 2) -> Int {
return x+y
}
在开发中,有的时候就会遇到需要默认值的函数,如上,等号后面的就是默认值。当函数中有一个传入参数没有传入时,就会采用默认值。
设置可变的参数数量
- 定义函数时,如果不能确定传入参数的数量,可通过变量类型后面加入
...
定义变量参数。 - 一个函数最多能有一个变量参数,且必须是函数表中的最后一个。
- 一个函数如果有一个或多个参数,变量参数一定放在最后。
func mean (numbers:Double...) -> Double {
if numbers.count==0 {
return 0.0
} else {
var temp :Double = 0
for number in numbers {
temp += number
}
return temp/Double(numbers.count)
}
}
这是一个求 Double类型平均值的函数,第二、三行代码是为了防止没有传入参数导致程序崩溃。
下面是for循环累加除参数数量,求平均值。
函数作为参数和返回类型
-
函数作为参数
func smaller (num1:Int, num2:Int) -> Int {
return(num1 > num2) ? num2 : num1
}
func bigger (num1:Int, num2:Int) -> Int {
return(num1 > num2) ? num1 : num2
}
func printMathResult(mathFunction:(Int,Int)->Int,num1:Int,num2:Int) {
print("The result is \(mathFunction(num1,num2))" + ".")
}
这里是三个函数:
- 第一个函数是求最小值 函数的类型是
(Int,Int)->Int
- 第二个函数是求最大值 函数的类型是
(Int,Int)->Int
- 第三个函数是把
mathFunction
作为一个参数传入,参数类型是(Int,Int)->Int
,该函数的另外两个参数是Int
,即这个函数的功能是把后两个传入参数通过matchFunction
这个作为传入参数的函数进行计算,然后输出。而matchFunction
这个函数做怎样的操作,就需我们传入了。这也是我们为什么要写第一个和第二个函数的目的。
printMathResult(mathFunction: smaller(num1:num2:), num1: 1, num2: 2)
printMathResult(mathFunction: bigger(num1:num2:), num1: 2, num2: 3)
-
函数作为返回类型
func smaller (num1:Int, num2:Int) -> Int {
return(num1 > num2) ? num2 : num1
}
func bigger (num1:Int, num2:Int) -> Int {
return(num1 > num2) ? num1 : num2
}
func chooseFunction(big:Bool) ->(Int,Int)->Int {
return big ? bigger : smaller
}
前两个函数还是上面的两个,求最大值和最小值。
只是这一次它们在第三个函数中作为返回参数存在。
如果输入的big
是true的话,就返回求最大值的函数,反之返回求最小值的函数。
然后我们可以在viewDidLoad()
或其他地方进行一些操作
let function = chooseFunction(big: true)
print(function(2,4))
我们定义了一个常量,并根据传入函数的的参数值为true
将bigger
函数赋予function
常量。
function的返回值是
(Int,Int)->Int
嵌套函数
接着上面的例子,来搞一个嵌套函数
嵌套函数,顾名思义就是在函数中有另外一个函数。函数里面的函数只在本函数中有作用。
func chooseNumber(big:Bool,number1:Int,number2:Int) {
func getSmaller() {
print((number1>number2) ? number2 : number1)
}
func getBigger() {
print((number1>number2) ? number1 : number2)
}
big ? getBigger() : getSmaller()
}
这个函数表示,在chooseNumber
函数中,有两个函数即打印最大值函数getBigger
和打印最小值函数getSmaller
,由传入的Bool
来控制调用哪个函数输出数值。
并且,getBigger
和getSmaller
只能在函数chooseNumber
中使用。
函数的输入输出参数
- 如果想要一个函数可以修改参数的值,并且这些修改在函数结束之后仍然存在,那就可以将参数定义为输入输出参数,这可以通过在参数类型的前面加入
inout
关键字来实现。 - 同时,传入函数的参数,只能是变量,不能是常量,当传入的参数作为输入输出参数时,需要在前面加上
&
符号,表示这个参数值是可以被修改的。
比如交换两个传入参数的值
func swap(num1: inout Int, num2: inout Int) {
let temp = num1
num1 = num2
num2 = temp
}
var number1 = 2
var number2 = 3
swap(num1: &number1, num2: &number2)
print(number1)
print(number2)
常用的内置函数
Swift包含众多的内置函数,这里只介绍几个常用的,
-
abs绝对值函数
print(abs(-1))
输出结果为1
-
min最小值函数
print(min(3,4,1))
输出结果为1
-
max最大值函数
print(max(2,5,3,1))
输出结果为5
-
filter函数
filter
函数用于查找在数组元素中,满足指定条件的元素,例如查数组中1~10能被3整除的数字。
let numbers = [1,2,3,4,5,6,7,8,9,10]
for i in numbers.filter({$0%3==0}) {
print(i)
}
$0
表示忽略了参数名,而使用默认参数为$0
输出结果为:
3
6
9
-
map函数
map
函数通常用于将数组中的每个元素,通过指定的方法进行转换。例如将数组中的每个整数都成3:
let numbers = [1,2,3,4,5,6,7,8,9,10]
for i in numbers.map({$0*3}) {
print(i)
}
输出结果为:
3
6
9
12
15
18
21
24
27
30
-
reduce函数
reduce
函数可以把数组元素组合计算为一个值,比如将数组中每个数字进行加法计算,获得元素之和。
let numbers = [1,2,3,4,5,6,7,8,9,10]
let sum = numbers.reduce(0, {$0+$1})
print(sum)
第一个参数为初始值,这里设置初始值为0了,就是将 0,1...到10依次相加。
也可以这样写
let sum2 = numbers.reduce(0, +)
print(sum2)
省略到上面的闭包。