摘要訊息 : Swift 中的函數教學.

0. 前言

文于 2022 年 3 月 17 日进行一次更新和修正. 修正之后本文已经归档, 不再享受更新.

1. 函数的定义与调用

函數可以定義為

/*func 函数名(参数变量 : 类型, 参数变量 : 类型, ...) -> 返回类型 {
    // ...
    // 陳述式
    return 返回值
}*/
func add(a : Int, b : Int) -> Int {
    return a + b;
}
var result = add(a : 5, b : 10);    // result 為 15

2. 参数默认值

func sum(number1 : Int = 1, number2 : Int = 1) -> Int {
    return number1 + number2
}
let a = sum()
let b = sum(number1 : 10, number2 : 20)
print(a)    // 结果 : 2
print(b)    // 结果 : 30

3. 可变函数参数

在定义函数的时候, 当不确定参数的具体数量的时候, 可以通过在变量后面加 "..." 从而实现可变参数. 一个函数最多只能有一个可变参数, 并且必须在函数表中最后一个位置 :

func getAverage(numbers : Double...) -> Double {
    if numbers.count == 0 {
    return 0.0
    }
    var total : Double = 0.0
    for num in numbers {
        total += num
    }
    return total / Double(numbers.count)
}
var average = getAverage()
print(average)    // 结果 : 0.0
average = getAverage(numbers : 1, 2, 3, 4, 5, 6)
print(average)    // 结果 : 3.5

4. 函數對象

函數變量本質上是變量, 它的表現類似於函數 :

func sum(number1 : Int, number2 : Int) -> Int {
    return number1 + number2
}
let function : (Int, Int) -> Int = sum
let result = function(1, 2)
print(result)    // 结果 : 3
let new_function = sum
let new_result = new_function(2,3)
print(new_result)    // 结果 : 5


func print_hello_swift() {
    print("Hello, Swift!")
}
let print : () -> () = print_hello_swift
print()    // 结果 : Hello, Swift!
let new_print = print_hello_swift
new_print() //    结果 : Hello, Swift!

5. 函数作为参数

func get_smaller(number1 : Int, number2 : Int) -> Int {
    return (number1 > number2) ? number2 : number1
}
func get_bigger(number1 : Int, number2 : Int) -> Int {
    return (number1 > number2) ? number1 : number2
}
func print_result(math_func : (Int, Int) -> Int, number1 : Int, number2 : Int) {
    print("The result is \(math_func(number1, number2))")
}
let a : Int = 1
let b : Int = -1
print_result(math_func : get_smaller, number1 : a, number2 : b)
print_result(math_func : get_bigger, number1 : a, number2 : b)
/* 结果 :
    The result is -1
    The result is 1
*/

6. 函数作为返回值

func get_smaller(number1 : Int, number2 : Int) -> Int {
    return (number 1 > number2) ? number2 : number1
}
func get_bigger(number1 : Int,number2 : Int) -> Int {
    return (number 1 > number2) ? number1 : number2
}
func choose_function(new_bigger : Bool) -> (Int, Int) -> Int {
    return new_bigger ? get_bigger : get_smaller
}
let function = chooseFunction(needBigger : true)
let a = function(1, 2)
print(a)    // 结果 : 2

7. 元组作为函数的返回值

当一个函数需要返回多个值的时候, 可以利用元组来返回多个值 :

func get_user_info(user_id : String) -> (username : String, user_level : Int, user_photo : String) {
    let username = "John"
    let user_level = 1
    let user_photo = "https://www.jonny.vip/userPhoto/bf293872f.jpeg"
    return (username, useruser_levelLevel, user_photo)
}
let message = get_user_info(user_id : "10000")
print(message.0)
print(message.1)
print(message.2)
/* 结果 :
    John
    1
    https://www.jonny.vip/userPhoto/bf293872f.jpeg
*/

8. 函数的嵌套

被嵌套的子函数只能在其父函数的内部使用, 在父函数的外部是无法被调用的 :

func choose(bigger : Bool, number1 : Int, number2 : Int) {
    func get_smaller(number1 : Int, number2 : Int) {
        print((number1 < number2) ? number1 : number2)
    }
    func get_bigger(number1 : Int, number2 : Int) {
        print((number1 > number2) ? number1 : number2)
    }
    bigger ? get_bigger(number1 : number1, number2 : number2) : get_smaller(number1 : number1, number2 : number2)
}

choose(bigger : false, number1 : 1, number2 : 2)    // 結果 : 2

9. 函数的递归

理论上所有递归函数都可以被写成循环的方式, 但是递归函数比循环更加简单并且逻辑清晰 :

func recursion(number : Int) -> Int {
    if n <= 1 {
        return 1
    }
    else {
        return recursion(number : number - 1) + recursion(number : number - 2)
    }
}
let num = recursion(number : 5)
print(num) // 结果 : 8

10. Swift 中常用的内置函数

  • abs : 絕對值函數;
  • min : 最小值函數;
  • max : 最大值函數;
  • filter : 在數組中查找滿足指定條件的元素 (for i in (1...10).filter({$0 % 3 == 0}) {print(i)});
  • map : 對數組中的每個元素使用指定的方法進行變換;
  • reduce : 把數組元素組合計算為一個值.