1)函数的一般形式
func test(a:Int,b:Int) -> Int{
return a+b
}
①
func
是定义函数的关键字,要定义一个函数必须使用
func
②test是函数名称,调用函数时使用
③(a: Int ,b: Int )是函数参数,表示要传入2个参数a和b,并且都是int类型
④->箭头是区分函数和返回值的符号,箭头前面为函数,箭头后面为返回值
⑤Int 箭头后面的Int表示函数的返回值为Int类型
2)无参数函数或者无返回值函数
func test() -> Int{ return2 } //无参数函数
func test(a:Int,b:Int){println("hello") } //无返回值函数
3)多返回值函数
多返回值函数又分为2种,一种是返回值无名字的,一种是返回值有名字的
①返回值无名字
func test() -> (String,Int){
return ("Hello",1)
}
let (name,count) = test()
println(name) //输出Hello
//返回值没有名字,在使用的时候就需要定义一个名字
②返回值有名字
func test() -> (name:String,count:Int){
return ("Hello",1)
}
let a = test()
println(a.name) //输出Hello
//返回值有名字,使用的时候就可以直接使用返回值的名字
1)外部参数
一般情况下,函数的参数只在函数内部有效,但Swift除了内部参数之外还可以使用外部参数, 有时当你调用一个函数将每个参数进行命名是非常有用的,以表明你传递给函数的每个参数的目的。
func test(name name:String,count count:Int){ println(name+String(count)) }
//()中前一个name和count是外部参数,后一个是内部参数,外部参数和内部参数可以不一样
test(name:"小笨狼",count:98) //输出:小笨狼98
使用外部参数之后,调用函数时必须带着外部参数,否则编译器会报错
当外部参数和内部参数一样时,可以使用#,如下所示
func test(#name:String,#count:Int){ println(name+String(count)) }
//()中前一个name和count是外部参数,后一个是内部参数,外部参数和内部参数可以不一样
test(name:"小笨狼",count:98) //输出:小笨狼98
注意:外部参数名称的初衷就是为了在别人第一次阅读你的代码时知道你函数参数的目的是什么。但当函数调用时如果每个参数的目的很明确时,你并不需要指定外部参数名称。
可以为任何参数设定默认值来作为函数的定义的一部分。如果默认值已经定义,调用函数时就可以省略该参数的传值。
func test(name:String,count:Int=0){
println(name+String(count))
}
test("小笨狼") //输出:小笨狼0
注意:
①良好的书写习惯是将所有带默认值的参数放在不带默认值参数的后面。 这确保了所有调用函数的非默认参数使用相同的顺序,并明确地表示在每种情况下相同的函数调用
②带有默认值之后,系统会自动认为这是外部参数,调用函数时如果需要传入一个值,则必须加上参数名称,不加名词编译器会报错
func test(name:String,count:Int=0){
println(name+String(count))
}
test("小笨狼",count:98) //输出:小笨狼0
3)可变参数
一个可变参数的参数接受零个或多个指定类型的值。当函数被调用时,您可以使用一个可变参数的参数来指定该参数可以传递不同数量的输入值。写可变参数的参数时,需要参数的类型名称后加上点字符(…)。
func test(name:String,counts:Int...){
println(name)
for b in counts{
println(b)
}
}
test("小笨狼",1,2,3) //输出:小笨狼 1 2 3
传递多个可变参数的参数的值时,函数体中的参数是以数组的形式存在的。这里counts就是一个常量数组
注意:
函数最多只能有一个可变参数,而且一定要放在参数列表的最后,以避免多参数函数调用时出现歧义
4)变量参数
函数的参数默认情况下是常量let类型,这就意味这在函数内部,参数是不可改变的,有的时候我们希望某个参数是变量,以方便在函数内部改变。这时候就要用到变量参数了
func test(var name:String){
name = "好人"
println(name)
}
var myName = "小笨狼"
test(myName) //输出:好人
println(myName) //输出:小笨狼
注意:
①变量参数函数调用时会为每个参数创建一个副本,在函数内改变参数不影响函数外面的参数。例:myname在函数内部赋值为 " 好人 ” ,但是在函数外面打印还是 " 小笨狼 ”
②变量函数只在函数体内部有效,出了函数体就无效了
5)输入输出参数
因为正常情况下,调用函数是不会改变传入的参数的值的。当你想让函数可以改变出入的参数的值时,你就需要使用输入输出参数了
func test(inout name:String){
name = "好人"
println(name)
}
var myName = "小笨狼"
test(&myName) //输出:好人
println(myName) //输出:好人
注意:
① 输出输出参数用 inout 关键字表示。
② 调用带有输入输出参数的函数时,传入的并不是参数本身,而是参数地址,如: test (& myName )
3. 嵌套函数
迄今为止所有你在本章中遇到函数都是全局函数,在全局范围内定义。其实你还可以在其他函数中定义函数,被称为嵌套函数。
func test(name:String){
func sayHello(name:String)
{
println("Hello,\(name)")
}
sayHello(name)
}
test("小笨狼") //输出Hello,小笨狼
注意:
① 嵌套函数作用域只在函数内部,出了函数之后就无法调用了。如: sayHello函数只能在test函数内部调用,出了test函数就不能调用