函数是一个独立的代码块,用来执行特定的任务。可以通过给函数自定义一个名字来确定该函数的功能,并且在需要的时候,通过名字来调用函数来执行他的任务。

Swift 统一的函数语法十分灵活,可以表达从简单的无形式参数的 C 风格函数到复杂的每一个形式参数都带有局部和外部形式参数名的 Objective-C 风格方法的任何内容。形式参数能提供一个默认的值来简化函数的调用,也可以被当作输入输出形式参数被传递,它在函数执行完成时修改传递来的变量。

定义和调用函数

函数使用一个 func的关键字前缀。你可以用一个返回箭头 -> (一个连字符后面跟一个向右的尖括号)来明确函数返回的类型,例如:

func saySomeThing(someWord:String)->String{
let sayWord = "hello, "+someWord
return sayWord
}

函数的调用:

let say = saySomeThing(someWord: "world")

print(say)
//输出:hello, world

函数的形式参数和返回值

  • 无形式参数的函数

函数没有要求必须输入一个参数,这里有一个没有输入形式参数的函数,无论何时它被调用永远会返回相同的 String信息:

func hellWorld()->String{

return "hello world!"
}

print(hellWorld())
//输出 hello world!

函数的定义仍然需要在名字后边加一个圆括号,即使它不接受形式参数也得这样做。当函数被调用的时候也要在函数的名字后边加一个空的圆括号。

  • 多形式参数的函数

函数可以输入多个形式参数,可以写在函数后边的圆括号内,用逗号分隔:

func sayHelloWorld(a:String,b:String)->String{

return a + ","+b
}

let val = sayHelloWorld(a: "hello", b: "world")

print(val)
//输出 hello,world
  • 无返回值的函数

函数定义中没有要求必须有一个返回类型,正因为它不需要返回值,函数在定义的时候就没有包含返回箭头( ->)或者返回类型:

func saySomeThing(a:String){
print(a)
}

saySomeThing(a: "hello world")
//输出 hello world
  • 多返回值的函数

为了让函数返回多个值作为一个复合的返回值,你可以使用元组类型作为返回类型:

func intAndString(dic:[Int:String])->(Int,String){

let keys = [Int](dic.keys)
let vals = [String](dic.values)
return(keys.first!,vals.first!)
//这里假设keys和vals数组一定不为空,做一次强制解析!
}

print(intAndString(dic: [1:"dapeng"]))
//输出(1, "dapeng")
  • 可选元组返回类型

如果元组在函数的返回类型中有可能“没有值”,你可以用一个可选元组返回类型来说明整个元组的可能是 nil 。书法是在可选元组类型的圆括号后边添加一个问号( ?)例如 (Int, Int)? 或者 (String, Int, Bool)? 。

注意:
类似 (Int, Int)?的可选元组类型和包含可选类型的元组 (Int?, Int?)是不同的。对于可选元组类型,整个元组是可选的,而不仅仅是元组里边的单个值。
这样上面的例子就可以这么写:

func intAndString(dic:[Int:String])->(Int,String)?{
let keys = [Int](dic.keys)
let vals = [String](dic.values)
return(keys.first!,vals.first!)//这里假设keys和vals数组一定不为空z,做一次强制解析
}

if let val = intAndString(dic: [1:"dapeng"]) {
print(val)
}
//输出:(1, "dapeng")
  • 隐式返回的函数

如果整个函数体是一个单一表达式,那么函数隐式返回这个表达式。像长一点的有多行代码的函数使用 return 关键字。你写的任何只有一行 return 的函数都可以省略那个 return 。

func greeting(for person: String) -> String {
"Hello, " + person + "!"
}
print(greeting(for: "Dave"))
// Prints "Hello, Dave!"
func anotherGreeting(for person: String) -> String {
return "Hello, " + person + "!"
}
print(anotherGreeting(for: "Dave"))
// Prints "Hello, Dave!"

函数实际参数标签和形式参数名

每一个函数的形式参数都包含实际参数标签和形式参数名。实际参数标签用在调用函数的时候;在调用函数的时候每一个实际参数前边都要写实际参数标签。形式参数名用在函数的实现当中。默认情况下,形式参数使用它们的形式参数名作为实际参数标签。

func myName(firstName:String,secondName:String){
}

myName(firstName: "lee", secondName: "dapeng")

左右的形式参数必须有唯一的名字。尽管有可能多个形式参数拥有相同的实际参数标签,唯一的实际参数标签有助于让你的代码更加易读。

  • 指定实际参数标签
    在提供形式参数名之前写实际参数标签,用空格分隔:
func myName(myName name:String){
}

myName(myName: "dapeng")