函数的定义和调用
1.函数的定义
fun 函数名(参数名1:参数类型,参数名2:参数类型...)->返回值类型{
函数体...
return 返回值
}
示例代码:
fun sum(x:Int,y:Int)->Int{
return x+y
}
2.函数的调用
函数名(参数名1:值1,参数名2:值2...)
示例代码
sum(x:10,y:20)
函数的参数和返回值
1.无参函数
fun sayHelloWorld()->String {
return "Hello,World!"
}
print(sayHelloWorld())
尽管这个函数没有参数,但是定义和调用函数时,函数后面的圆括号是不能省略的。
2.多参数函数
fun sum(x:Int,y:Int)->Int{
return x+y
}
3.无返回值参数
无参数返回值的格式比较随意,可以在箭头后面跟着Void或者小括号,也可以直接省略箭头及后面的内容。
func test1() {
print("哈哈")
}
func test2()->Void {
print("呵呵")
}
func test3()->(){
print("嘻嘻")
}
test1()
test2()
test3()
4.多返回值函数
使用元组类型作为函数的返回值,可以让多个值作为一个复合值返回。
fun count(string:String)->(vowels:Int,consonants:Int,others:Int){
var vowels = 0,consonants = 0,others = 0
for character in string.characters{
switch String(character).lowercased(){
case "a","e","i","o","u": // 元音
vowels += 1
case "b","c","d","f","g","h","j","k","l","m",
"n","p","q","r","s","t","v","w","x","y","z": // 辅音
consonants += 1
default:
others += 1
}
}
return(vowels,consonants,others)
}
let total = count(string:"hello world")
print("\(total.vowels)个元音字母和\(total.consonants)个辅音字母")
如果函数返回的元组类型可能整个元组都没有值,那就可以使用可选的元组返回类型来反应元组是nil的事实,通过在元组类型的右括号后面防止一个问号来定义一个可选数组,如(Int,Int)?。
局部变量名和外部参数名
1.局部参数名
func someFunction(firstParameterName:Int,secondParameterName:Int){
// 函数体
}
someFunction(firstParameterName:1,secondParameterName:2)
2.外部参数名
fun 函数名(外部参数名1 参数名1:参数类型,外部参数2 参数名2:参数类型...)-> 返回值类型{
函数体...
return 返回值
}
所谓外部参数名,是指在参数名的前面再添加一个参数名。
fun compare(num1 x:Int,num2 y:Int)->Int{
return x>y?x:y
}
compare(num1:10 num2:20)
函数参数的其他用法
1.默认参数值
给参数定义一个默认值作为函数定义的一部分,如果已经定义了默认值,调用该函数时就能够省略这个参数。
fun sayHi(message:String,name:String = "小明"){
print("\(name),\(message)")
}
sayHi(message:"欢迎来到杭州") // 输出小明
sayHi(message:"欢迎来到杭州",name:"小芳") // 输出小芳
Swift中带有默认值的参数是有外部参数名的,如果要忽略的话,将name改成下划线即可。
2.可变参数
一个可变参数可以接受零个或者多个指定类型的值。函数调用时,使用可变参数来指定函数参数可以被传入不确定数量的输入值,通过在变量类型名后面加入‘...’的方式来定义可变参数。
3.In-Out(输入输出)参数
一般参数仅仅是在函数内可以改变的,当这个函数执行完后变量就会被销毁,如果想要通过一个函数可以修改参数的值,并且让这些修改在函数调用结束后仍然存在,这时可以将这个参数定义为输入输出参数即可。定义一个输入输出函数时,只要在参数类型前面加上inout即可。
func swapTwoInts(a: inout Int,b: inout Int){
let temporaryA = a
a = b
b = temporaryA
}
在上诉代码中,swapTwoInts函数用于交换a和b的值。调用该函数,代码如下:
var someInt = 3
var anotherInt = 107
swapTwoInts(a:&someInt,b:&anotherInt)
inout修饰的参数是不能有默认值的,也不能是有范围的参数集合,另外,一个参数一旦被inout修饰,就不能在被let 修饰了。
嵌套函数
前面定义的函数都是全局函数,它们定义在全局作用域中,除此之外,还可以把函数定义在其它函数体内,成为嵌套函数。默认情况下,嵌套函数是对外界不可见的,但是可以被其被外围函数所调用。