第6章:函数
2019-02-16 本文已影响0人
行知路
函数代表一段代码块,通过函数名可以调用该段代码块。Swift对函数的支持相较于Objective-C更加强大,改进的地方不太多。
6.1 函数示例
以下是一个函数的示例,可以看到函数通过func关键字来标识,之后函数名、参数列表与返回值,再之后是由大括号包含的函数体。
// 函数定义示例
func greet(person: String) -> String {
let greeting = "Hello, " + person + "!"
return greeting
}
// 函数调用示例
print(greet(person: "Anna"))
// Prints "Hello, Anna!"
print(greet(person: "Brian"))
// Prints "Hello, Brian!"
6.2 函数参数与返回值
6.2.1 函数参数
函数可以包含0个或者多个参数,所有参数都需要写在函数定义的小括号内部。
// 没有参数的函数
// 注意:即使没有参数,仍然需要小括号
func sayHelloWorld() -> String {
return "hello, world"
}
print(sayHelloWorld())
// Prints "hello, world"
// 函数如有多个参数,需要使用逗号进行分割
func greet(person: String, alreadyGreeted: Bool) -> String {
if alreadyGreeted {
return greetAgain(person: person)
} else {
return greet(person: person)
}
}
print(greet(person: "Tim", alreadyGreeted: true))
// Prints "Hello again, Tim!"
函数参数可以具有标签,具体语法如下。函数标签给外部调用的人使用,函数名用于函数体。
func someFunction(argumentLabel parameterName: Int) {
// In the function body, parameterName refers to the argument value
// for that parameter.
}
// 请注意以下from、hometown的具体用法
func greet(person: String, from hometown: String) -> String {
return "Hello \(person)! Glad you could visit from \(hometown)."
}
print(greet(person: "Bill", from: "Cupertino"))
// Prints "Hello Bill! Glad you could visit from Cupertino."
// 可以通过添加_来省略函数参数的标签
// 也可以直接不写函数标签的方式来忽略函数参数的标签
func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
// In the function body, firstParameterName and secondParameterName
// refer to the argument values for the first and second parameters.
}
someFunction(1, secondParameterName: 2)
在Swift中函数参数包含若干默认值,参数默认值的语法如下。
func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
// If you omit the second argument when calling this function, then
// the value of parameterWithDefault is 12 inside the function body.
}
someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault is 6
someFunction(parameterWithoutDefault: 4) // parameterWithDefault is 12
在Swift中可以处理包含数量不确定的函数——即变量参数。
func arithmeticMean(_ numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
// returns 3.0, which is the arithmetic mean of these five numbers
arithmeticMean(3, 8.25, 18.75)
// returns 10.0, which is the arithmetic mean of these three numbers
函数可以包含多个变量参数
在Swift中函数参数默认是常量
,所以函数参数不可修改;如果想要修改函数参数的值,则可以使用输入输出参数,具体语法参阅下面示例。
// 通过在函数参数类型的前面添加inout关键字来实现标识参数是输入输出参数的功能
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
// 请注意在调用函数时,碰到输入输出参数,需要把在实参的前面添加&符号
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"
6.2.2 函数返回值
// 返回值写在函数定义的右小括号后面以->开头
// 以下是没有返回值的函数
// 其实该函数有返回值,返回值是void,如果函数没有void的话可以不写
func greet(person: String) {
print("Hello, \(person)!")
}
greet(person: "Dave")
在swift中函数可以返回多个值,这些值通过元组返回,具体语法见下面示例。
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)
}
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
// Prints "min is -6 and max is 109"
在swift中函数返回多个值时,如果是可选值的话通过在返回值后面添加?来实现,具体语法见下面示例。
func minMax(array: [Int]) -> (min: Int, max: Int)? {
if array.isEmpty { return nil }
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)
}
6.3 函数的类型
在swift中函数也是一种类型,与Int等相同,函数同样可以作为函数参数、返回值等。与之类似的功能在C语言里叫做函数指针。
函数类型是有函数的参数列表与返回类型确定的。
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a + b
}
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
return a * b
}
// 以上两个函数的类型是 (Int, Int) -> Int
// 声明一个函数类型的变量
var mathFunction: (Int, Int) -> Int = addTwoInts
// 通过函数类型的变量调用函数
print("Result: \(mathFunction(2, 3))")
// Prints "Result: 5"
// 函数类型作为参数
func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
print("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// Prints "Result: 8"
// 函数类型作为返回值
func stepForward(_ input: Int) -> Int {
return input + 1
}
func stepBackward(_ input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
return backward ? stepBackward : stepForward
}
var currentValue = 3
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero now refers to the stepBackward() function
在函数内部定义的函数叫作嵌套函数,嵌套函数主要在定义其的函数内使用,但也可作为返回值,被外部使用,示例如下。
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
func stepForward(input: Int) -> Int { return input + 1 }
func stepBackward(input: Int) -> Int { return input - 1 }
return backward ? stepBackward : stepForward
}
var currentValue = -4
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero now refers to the nested stepForward() function
while currentValue != 0 {
print("\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// -4...
// -3...
// -2...
// -1...
// zero!