参考书籍:
[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