发布于 2022-03-06
Swift - 函数
swift
Swift 中的函数可以完成特定的任务,并且可以重复使用。函数使代码的组织和抽象化更加容易,也使代码更易于维护和重构。
学习目标
通过本教程,你将学会:
- 掌握函数的定义和调用
- 理解函数参数和返回值的各种用法
- 了解默认参数、可变参数、inout 参数
- 掌握函数类型和函数作为参数或返回值
- 能够编写实用的函数解决实际问题
前置知识
Swift 中的函数可以完成特定的任务,并且可以重复使用。函数使代码的组织和抽象化更加容易,也使代码更易于维护和重构。
函数的基本定义
// 定义一个函数
func greet(person: String) -> String {
let greeting = "Hello, " + person + "!"
return greeting
}
// 调用函数
let result = greet(person: "Tom")
print(result)Swift 中的函数有以下特点:
- 可以有多个参数,每个参数都有一个名字和一个类型。
- 可以有返回值,返回值可以是任何类型,也可以没有返回值。
- 可以有默认参数,使函数的调用更加方便。
- 可以使用可变参数,使函数的参数数量变得不确定。
- 可以使用 inout 参数,使函数可以修改传入参数的值。
- 可以使用函数类型,使函数作为参数或返回值传递。 以下是上述特点的示例:
// 默认参数
func greet(person: String, greeting: String = "Hello") -> String {
let result = greeting + ", " + person + "!"
return result
}
let result2 = greet(person: "Tom")
let result3 = greet(person: "Tom", greeting: "Hi")
// 可变参数
func sum(numbers: Int...) -> Int {
var result = 0
for number in numbers {
result += number
}
return result
}
let result4 = sum(numbers: 1, 2, 3, 4)
// inout 参数
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temp = a
a = b
b = temp
}
var a = 10
var b = 20
swapTwoInts(&a, &b)
// 函数类型
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
func subtract(_ a: Int, _ b: Int) -> Int {
return a - b
}
func operate(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) -> Int {
return operation(a, b)
}
let result5 = operate(10, 5, operation: add)
let result6 = operate(10, 5, operation: subtract)函数类型
函数类型可以像其他类型一样使用,可以作为参数传递或作为返回值:
// 函数类型作为参数
func calculate(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) -> Int {
return operation(a, b)
}
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
func multiply(_ a: Int, _ b: Int) -> Int {
return a * b
}
let result1 = calculate(10, 5, operation: add)
let result2 = calculate(10, 5, operation: multiply)嵌套函数
可以在函数内部定义另一个函数:
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
}练习
练习 1:基本函数
编写以下函数:
- 一个函数计算两个数的和
- 一个函数判断一个数是否为偶数
- 一个函数返回两个数中的较大值
参考答案:
// 1. 计算和
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
let sum = add(10, 20)
print("和:\(sum)")
// 2. 判断偶数
func isEven(_ number: Int) -> Bool {
return number % 2 == 0
}
print(isEven(4)) // true
print(isEven(5)) // false
// 3. 返回较大值
func max(_ a: Int, _ b: Int) -> Int {
return a > b ? a : b
}
print(max(10, 20)) // 20练习 2:参数标签
编写函数,使用不同的参数标签:
- 一个函数计算矩形面积,使用外部参数名
width和height - 一个函数格式化输出姓名,使用外部参数名
firstName和lastName - 使用
_省略外部参数名
参考答案:
// 1. 矩形面积
func rectangleArea(width: Int, height: Int) -> Int {
return width * height
}
let area = rectangleArea(width: 10, height: 5)
print("面积:\(area)")
// 2. 格式化姓名
func formatName(firstName: String, lastName: String) -> String {
return "\(lastName), \(firstName)"
}
let name = formatName(firstName: "三", lastName: "张")
print(name) // 张, 三
// 3. 省略外部参数名
func greet(_ name: String, message: String = "Hello") -> String {
return "\(message), \(name)!"
}
print(greet("Swift")) // Hello, Swift!
print(greet("World", message: "Hi")) // Hi, World!练习 3:默认参数和可变参数
编写以下函数:
- 一个计算幂的函数,默认指数为 2
- 一个函数计算多个数的平均值(使用可变参数)
- 一个函数连接多个字符串(使用可变参数和分隔符)
参考答案:
// 1. 计算幂
func power(_ base: Int, exponent: Int = 2) -> Int {
var result = 1
for _ in 1...exponent {
result *= base
}
return result
}
print(power(3)) // 9 (3^2)
print(power(2, exponent: 4)) // 16 (2^4)
// 2. 计算平均值
func average(_ numbers: Double...) -> Double {
guard numbers.count > 0 else { return 0 }
var sum: Double = 0
for number in numbers {
sum += number
}
return sum / Double(numbers.count)
}
print(average(1, 2, 3, 4, 5)) // 3.0
print(average(10, 20, 30)) // 20.0
// 3. 连接字符串
func joinStrings(_ strings: String..., separator: String = ", ") -> String {
return strings.joined(separator: separator)
}
print(joinStrings("苹果", "香蕉", "橙子"))
// 输出:苹果, 香蕉, 橙子
print(joinStrings("Swift", "Python", "Java", separator: " | "))
// 输出:Swift | Python | Java练习 4:inout 参数
编写函数使用 inout 参数:
- 一个函数交换两个变量的值
- 一个函数将数组中的所有元素翻倍
- 一个函数对数字进行递增操作
参考答案:
// 1. 交换两个值
func swap(_ a: inout Int, _ b: inout Int) {
let temp = a
a = b
b = temp
}
var x = 10
var y = 20
swap(&x, &y)
print("x = \(x), y = \(y)") // x = 20, y = 10
// 2. 数组元素翻倍
func doubleArray(_ numbers: inout [Int]) {
for i in 0..<numbers.count {
numbers[i] *= 2
}
}
var numbers = [1, 2, 3, 4, 5]
doubleArray(&numbers)
print(numbers) // [2, 4, 6, 8, 10]
// 3. 递增操作
func increment(_ number: inout Int, by amount: Int = 1) {
number += amount
}
var value = 5
increment(&value)
print(value) // 6
increment(&value, by: 3)
print(value) // 9练习 5:函数类型和高级用法
编写以下函数:
- 一个函数接受操作符函数作为参数,执行不同的运算
- 一个函数返回另一个函数(实现简单的计数器)
- 使用函数类型作为返回值
参考答案:
// 1. 操作符函数
func performOperation(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) -> Int {
return operation(a, b)
}
func add(_ a: Int, _ b: Int) -> Int { return a + b }
func subtract(_ a: Int, _ b: Int) -> Int { return a - b }
func multiply(_ a: Int, _ b: Int) -> Int { return a * b }
print(performOperation(10, 5, operation: add)) // 15
print(performOperation(10, 5, operation: subtract)) // 5
print(performOperation(10, 5, operation: multiply)) // 50
// 2. 返回函数(计数器)
func makeCounter(start: Int = 0) -> () -> Int {
var count = start
return {
count += 1
return count
}
}
let counter1 = makeCounter()
print(counter1()) // 1
print(counter1()) // 2
print(counter1()) // 3
let counter2 = makeCounter(start: 10)
print(counter2()) // 11
print(counter2()) // 12练习 6:综合练习
编写一个简单的计算器程序,包含以下功能:
- 加、减、乘、除运算函数
- 一个通用的计算函数,接受操作符和两个数
- 一个函数计算多个运算的结果
参考答案:
// 基本运算函数
func add(_ a: Double, _ b: Double) -> Double { return a + b }
func subtract(_ a: Double, _ b: Double) -> Double { return a - b }
func multiply(_ a: Double, _ b: Double) -> Double { return a * b }
func divide(_ a: Double, _ b: Double) -> Double? {
guard b != 0 else { return nil }
return a / b
}
// 通用计算函数
func calculate(_ a: Double, _ b: Double, operation: String) -> Double? {
switch operation {
case "+":
return add(a, b)
case "-":
return subtract(a, b)
case "*":
return multiply(a, b)
case "/":
return divide(a, b)
default:
return nil
}
}
// 使用
if let result = calculate(10, 5, operation: "+") {
print("10 + 5 = \(result)")
}
if let result = calculate(10, 0, operation: "/") {
print("10 / 0 = \(result)")
} else {
print("除数不能为零")
}总结
本章介绍了 Swift 中函数的各种用法:
- 函数定义:使用
func关键字定义函数 - 参数和返回值:可以有多个参数和返回值
- 参数标签:外部参数名和内部参数名
- 默认参数:为参数提供默认值
- 可变参数:使用
...表示可变数量的参数 - inout 参数:修改外部变量的值
- 函数类型:函数可以作为参数和返回值
函数是代码组织和重用的基础,下一章我们将学习 闭包,了解 Swift 中强大的闭包特性。