一、函数的定义和调用
1.使用func关键字标识函数
2.定义函数时,可以接受的一个或多个命名的类型值的参数
3.返回箭头( ->)指示函数的返回类型,后面跟有要返回的类型的名称
4.使用函数名称调用函数
func greet(person: String) -> String {
let greeting = "Hello," +person + "!"
return greeting
}
print(greet(person: "Jack"))//Hello, Jack!
二、函数参数和返回值
1.无参数的函数
func sayHelloWorld()-> String{
return "hello, world !"
}
print(sayHelloWorld())//hello, world !
2.多个参数的函数
//函数可以有多个输入参数,它们写在函数的括号内,参数之间用逗号分隔。
func greet(person: String, alreadyGreeted: Bool) -> String {
if alreadyGreeted {
return person
} else {
return"hello," + person
}
}
print(greet(person: "Tim",alreadyGreeted: true))//Tim
3.无返回值的函数
//没有定义的返回类型的函数返回类型为Void的特殊值。这只是一个空的元组,它写成()
func greetFriend(person:String) {
print("Hello, \(person)!")//Hello, Dave!
}
greetFriend(person: "Dave")
4.具有多个返回值的函数
//使用元组类型作为函数的返回类型,以作为一个复合返回值的一部分返回多个值。
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)
}
print(minMax(array: [2,6,8,23,67]))//(2, 67)
5.返回可选元组类型
//如果要从函数返回的元组类型具有对整个元组“void”的能力,则可以用可选的元组返回类型使得整个元组可以为nil,如(Int, Int)? 或者 (String, Int, Bool)?
//注:可选的元组类型如(Int,Int)?不同于包含可选类型的元组(Int,Int?)
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.函数参数别名和参数名称
//每个函数参数都具有参数别名和参数名称。参数别名在调用函数时使用; 每个参数写在函数调用中,其参数别名在它之前。 参数名称用于函数的实现。默认情况下,参数使用其参数名称作为其参数别名。
funcsomeFunction(firstParameterName: Int, secondParameterName: Int) {
// 默认情况下,参数使用其参数名称作为其参数别名。
}
someFunction(firstParameterName:1,secondParameterName: 2)
//1>.指定参数别名
//参数名称之前写入参数别名,用空格分隔
func somebody(person: String, from hometown: String) -> String {
return "\(person)! come from \(hometown)."
}
//如果参数具有参数别名,则在调用函数时必须标记参数
print(somebody(person: "ZhangSan",from: "Beijing"))//ZhangSan! comefrom Beijing.
//2>.省略参数别名
//如果不想要参数的参数别名,请为该参数编写下划线(_),而不是显式参数别名。
func someFunction(_ firstParamName: Int, secondParamName: Int) {
}
someFunction(1, secondParamName: 2)
7.参数默认值
可以通过为该参数的类型之后的参数分配值来为该函数中的任何参数定义默认值。如果定义了默认值,则可以在调用该函数时忽略该参数。
funcsomeFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
}
someFunction(parameterWithoutDefault:3,parameterWithDefault: 6) //parameterWithDefault is 6
someFunction(parameterWithoutDefault:4) // parameterWithDefault is 12
8.可变参数
可变参数接受指定类型的零个或多个值。可以使用可变参数来指定在调用函数时,参数可以传递不同数量的输入值。通过在参数的类型名称后插入三个句点字符(...)来写入可变参数。
//注:函数最多可以有一个可变参数。
//求算术平均值
func arithmeticMean(_ numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
print(arithmeticMean(1, 2, 3, 4, 5))//3.0
print(arithmeticMean(3, 8.25, 18.75))//10.0
9.inout参数
//默认情况下,函数参数是常量。试图从函数体内更改函数参数的值会导致编译时错误。
//如果希望函数修改参数的值,并且希望这些更改在函数调用结束后保留,In-Out参数具有传递到函数的值,由函数修改,并被传回函数以替换原始值。
//注:1.只能将一个变量作为in-out参数的参数传递。不能将常量或文字值作为参数传递,因为常量和文字不能被修改。
//2.in-out参数不能具有默认值,可变参数也不能标记为inout。
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt = 3
var anotherInt = 107
//在将变量的名称作为参数传递给in-out参数时,在变量名称之前直接放置一个&符号(&),以指示它可以被该函数修改
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")//someInt is now 107, and anotherInt is now 3
三、函数类型
//每个函数都有一个特定的函数类型,由参数类型和函数的返回类型组成。
//一个具有两个Int类型参数,返回值也是Int类型的函数
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a + b
}
1.使用函数类型
//可以将常量或变量定义为函数类型,并为该变量分配适当的函数
//定义一个名为mathFunction的变量,它的类型是一个函数,它接受两个Int值,并返回一个Int值。设置这个新变量以引用称为addTwoInts的函数。
var mathFunction: (Int, Int) -> Int = addTwoInts
print("Result: \(mathFunction(2, 3))")//Result: 5
2.函数类型作为参数类型
func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
print("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
3.函数类型作为返回类型
func stepForward(_ input: Int) -> Int {
return input + 1
}
func stepBackward(_ input: Int) -> Int {
return input - 1
}
funcchooseStepFunction(backward: Bool) -> (Int) -> Int {
return backward ? stepBackward : stepForward
}
var currentValue = 3
let moveNearerToZero = chooseStepFunction(backward:currentValue> 0)
while currentValue != 0 {
print("\(currentValue)...")
currentValue = moveNearerToZero(currentValue)
}
/*
3...
2...
1...
*/
4.函数嵌套
funcchooseStepFunction(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)
while currentValue != 0 {
print("\(currentValue)...")
currentValue = moveNearerToZero(currentValue)
}
/*
-4...
-3...
-2...
-1...
*/