Swift学习笔记-函数

参考书籍:
[1]管蕾.张玲玲.朱元波.Swift开发实战[M]. 北京:人民邮电出版社.2014.10-1 ISBN 978-7-115-36827-0
[2]陈隽.刘媛媛.Swift入门很简单[M]. 北京:清华大学出版社.2015.01-01 ISBN 978-7-302-38880-7

一、形式

func 函数名(参数表)->返回值类型
{
语句
}

 
二、无参函数

func printaa(){ //即使无参,()也不能省略
}
printaa() //调用方式

二、有参函数
1、一般形式

func 函数名(参数名1:数据类型,参数2:数据类型,...)->返回值类型
{
}

注意:参数个数定义与调用需一致,顺序也须一致
三、特殊情况
定义有参函数是,为每一个参数都定义了函数名称,根据函数名称形式不同,函数参数名包括本地参数名和外部参数名。
1、本地参数名

func fun(start:Int,end:Int,str:String)//start,end,str 都是本地参数名,只能在函数本身代码中使用
{
}

2、外部参数名
外部参数和本地参数定义一样,但是开发者需要更好的表达参数功能,需要定义使用外部参数名。外部参数名需要写在本地参数名之前,并用空格隔开。
一般形式:

func 函数名(外部参数名 本地参数名:数据类型)
函数名(外部参数名:参数值) //外部调用

如:

func join(string s1:String,tostring s2:String,joiner s3:String)
{
}
join(string:"hello",tostring:"swift,joiner:",") //调用

注意:
1、若提供了外部参数,则调用时必须使用外部参数名,否则程序提示错误。
2、外部参数名调用顺序必须和声明定义顺序一致
3、快速写法:如果本地参数名和外部参数名一致,可使用’#‘号作为前缀,例如
func 函数名(#本地参数名:数据类型)
{
}

3、设定参数默认值

func fun(start:Int=0,end:Int=5)
{
}
fun() //不修改默认参数调用
fun(start:3,end:8) //改变默认值调用
fun(start:3) //改变部分默认值
//注意:若使用默认参数,swift会自动为该参数提供同名的外部参数名。
//如果调用时必须要使用外部参数。不能直接赋值,否则会报错。

4、可变参数
使用可变参数,可以使一个参数接收零个或多个指定类型的值。
设定可变参数,需要在参数类型名后添加”…”

func average(numbers:Double...){
for number in numbers{
}
}
average(1,2,3,4,5) //调用
average(3,4,5) //调用

注意:
1、一个函数可变参数只能有一个,否则会报错。
2、可变参数必须放在最后,否则会报错。
5、常量参数和变量参数
在函数中,参数默认都是常量,如果想改变一个函数参数值,就会报错。

func fun(num:int)
{
num+=1 //报错
}

如果需要修改参数,则必须定义变量参数,在参数名称前使用var关键字。

func fun(var num:int)
{
num+=1 //不会报错
}

6、输入输出参数(类似于c 中引用传参)
一般形式:

func 函数名(inout 参数名:数据类型,...)
{
}
函数名(&参数) //调用

四、函数返回值
1、一个返回值
一般形式:

func 函数名(参数列表)->返回值类型{
语句
return 表达式
}

例如:

func range(start:Int,end:Int)->Int{
return end-start
}
var a=range(0,10) //调用

2、多个返回值
一般形式:

func count(参数列表)->(返回值1:数据类型,返回值2:数据类型,...)
{
...
return(返回值1,返回值2,...)
}

例如:

func count(string:String)->vowels:Int,consonants:Int)
{
...
return (vowels,consonants)
}
let str=count("Hello")
print(\(str.vowels))

注意:
1、->后面返回值个数必须和return 一致
2、->后面返回值顺序必须和return 一致
五、函数类型
在swift中每一个函数都是一个特定的类型,这种类型称为函数类型。
1、使用函数类型
作为一种类型,可以像任何其它类型一样使用函数类型,基本语法:

let/var 常量/变量名:函数类型=函数名
或者
let/var 常量名/变量名=函数名

例如:使用一个mathFunction变量引用add函数

func add(a:Int,b:Int)->Int{ //原声明定义
return a+b
}
var mathFunction:(Int,Int)->Int =add //使用函数类型引用
var mathFunction=add //第二种形式,因为swift具有自动判断类型的能力,故可以直接赋值
print(mathFunction(2,7)) //调用

如果不同函数具有相同的函数类型,这是把它们赋值给同一变量。
如:

func multiply(a:Int,b:Int)->Int{
return a*b
}
mathFunction = multiply //mathFunction 和 multiply 类型匹配,故可以直接赋值

2、使用函数类型作为参数类型
开发者可以使用函数类型作为另一个函数的参数类型。
例如:下代码,功能是让两个数进行相加或者相乘,然后输出。

import Foundation
func add(a:Int,b:Int)->Int{
return a+b
}
func multiply(a:Int,b:Int)->Int{
return a*b
}
func printresult(fun:(Int,Int)->Int,a:Int,b:Int){ //使用函数类型作为参数类型
print(fun(a,b))
}
printresult(add,a:3,b:2) //调用

printresult(multiply,a:3,b:2) //调用

终端:

5
6
Program ended with exit code: 0

3、函数类型作为返回值类型
语法形式:

func 函数名(参数列表)->函数类型{
...
}

例如:

import Foundation
func stepForward(input:Int)->Int{
return input+1
}
func stepBackward(input:Int)->Int{
return input-1
}
func chooseStepFunction(backwards:Bool)->(Int)->Int{ //该函数返回的是函数
return backwards ? stepBackward : stepForward
}
var currentValue = 5
let moveNearerTozero = chooseStepFunction(currentValue>0) //指向正确的函数
while currentValue != 0{
print("\(currentValue)..")
currentValue = moveNearerTozero(currentValue)
}

终端:

5..
4..
3..
2..
1..
Program ended with exit code: 0