函数是一个完成特殊任务的代码块,我么可以给出这个函数一个命名并用此名来表示这个函数作用,当我们需要用到这个函数的时候,可以调用这个函数的名字来执行某项任务。每个函数都是由函数参数类型(function's parameter types
)和返回类型(return type
)组成的一个类型。可以想其他类型一样定义和调用函数类型。一个函数的定义也可以被写在另一个函数里面,这样可以封装实用功能在一个嵌套的函数范围内。
当我们在定义函数的时候可以选择性的定义一个或多个有名字和类型的值,此时我们把函数带有名字和类型的值作为输入 (input
) 并把这一块称之为参数 (parameter
),我们也可以选择性的定义一种类型的值,并把这个值看作为函数执行完毕后的返回值(return value
)。
每一个函数都有一个函数名(function name
),函数名表示这个函数要执行的任务,要使用一个函数我们就要通过调用这个函数名并且传递给他一个输入值,这个输入值(input value)也被叫做实参(argument
),实参是由实参名(argument label
)和实参类型(argument type
)组成
func greet(person: String) -> String {
let greeting = "Hello, " + person + "!"
return greeting
}
注意事项:
一般用关键字func
来引出并介绍这个函数的,函数的名字叫greet()
,这个函数的输入值person: String
叫做函数的参数或实参,是一个有参数名person
和参数类型String
组成的输入值,函数的返回值一般用 ->
来引出并介绍函数的返回值的,->后面的String
就是这个函数返回值的类型。函数体是有一个定义的常量和返回的值,对这个定义的新常量进行一个字符串插入操作("Hello, " + person + "!"
) 最后把这个操作好的返回值(return greeting
)传回给这个函数也就是传回给 -> String
被这个函数接收。
print(greet(person: "Anna"))
// 输出:Hello, Anna!
print(greet(person: "Brian"))
// 输出:Hello,Brian!
调用函数greet(person: String)并把Anna作为函数的输入值,然后执行函数体的操作。最后把操作完毕的函数体返回值传回给这个函数,最后在右print()接受并输出这些文本信息。
func greetAgain(person: String) -> String {
// 有多个返回值 首先print()以把Anna作为输入参数的方法调用greetAgain函数,返回值又把Anna作为返回值的一部分,返回给greetAgain函数,最后由print()接收到这个函数的返回值并输出这个返回值。
return "Hello again", + person + "!"
}
print(greetAgain(person: "Anna"))
// 输出:Hello again, Anna!
函数的参数和返回的值在函数里面是非常重要,并且也是可以非常灵活的被应用在函数里面,我们可以定义任何类型的函数, 有参数(单个或多个)的函数和无参数的函数,有返回值(单个或多个)的函数和返回值的函数,
func sayHelloWorld() -> String {
return "hello, world"
}
print(sayHelloWorld())
// 输出: hello, world
这个sayHelloWorld()函数虽然没有输入值/参数,可是在他的函数体有一个返回String的返回值, 所以这是一个无输入值但带有输出值的函数类型。
func greet(person: String, alreadyGreeted: Bool) -> String {
if alreadyGreeted {
return greetAgain(person: person)
} else {
return greet(person: person)
}
}
print(greet(person: "Tim", alreadyGreeted: true))
// 输出: Hello again, Tim!
这中类型的函数输入值有两个(person: String
) 和 (alreadyGreeted: Bool
) 输出值是String类型,在函数体里面是一个有if-else的条件语句组成,并且这个if或else从句都有一个独立的返回值用来返回和传输被这个函数接受, 被函数作为输出值的return值。
func greet(person: String) {
print("Hello, \(person)!")
}
greet(person: "Dave")
这种类型的函数是没有返回值 也就是没有输出的一个函数,但是在这个函数体里面 函数会输出打印它自己本身的输入值类型也就是这个String,也就是说当前这个函数他会输出一个Hello,+ String类型的person。最后给这个函数的输入重新定义一个输入值 Dave 所以这个函数就回执行打印操作了。
// 多个返回值的函数
func minMax(array: [Int]) -> (min: Int, max: Int) {
// 函数体的内部逻辑操作
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
// 对函数输入值类型是array的情况下 进行赋值操作
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
上面的例子(X有多个返回值的函数) 没有充分考虑到如果这个Array是空白的情况。若个这个Array是空白Array那么当我们试图读取currentMin 和 currentMax 在同一个index的其情况下 currentMin = array[0]
,currentMax = array[0]
就回出现报错。所以我们在编码的时候要提前预防考虑到这种情况。可以用isEmpty()方法来判断这个Array是否是空白Array。
func minMax(array: [Int]) -> (min: Int, max: Int) {
var currentMin = array[0]
var currentMax = array[0]
// 判断Array是否是空白的
if array.isEmpty { return nil }
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
当一个函数的整个函数体里面只有一个表达式的时候,那么这个函数将会含蓄地(implicitly)返回这个表达式。
func greeting(for person: String) -> String {
/* 函数体里面只有一个表达式时
函数会含蓄地返回这个表达式 */
"Hello, " + person + "!"
}
print(greeting(for: "Dave"))
func anotherGreeting(for person: String) -> String {
// 可以省略 return 关键字
return "Hello, " + person + "!"
}
print(anotherGreeting(for: "Dave"))