Swift 5 – 函数与闭包
     发布在:Swift      浏览:18      评论:0 条评论

函数

常见的函数定义

func 函数名(形参) -> 返回值类型 {
    // 具体实现
    return 返回值
}

无参无反

func about1() -> Void {
    print("first.")
}

func about2() -> () {
    print("second.")
}

func about3() {
    print("third.")
}

有参无反

func about(a: Int) {
    print(a)
}

无参有反

func about() -> String {
    return "Hello Word!"
}

有参有反

func about(a: Int) -> Int {
    return a * 2
}

注意事项

注意一: 形参常量

Swift 函数形参默认为常量,无法在函数内部修改形参值。

let a = 10

func show(input: Int) {
    print("intput 1: \(input)")
    input += 1 // show error
}

注意二: 形参标签

每一个函数的形参都包含 形参标签形参名

  • 形参标签 用于调用函数时显示
  • 形参名 用于函数内部使用
func show(input name: String) {
    print(name)
}
show(input: "LiSi")

func show2(_ name: String) {
    print(name)
}
show2("WangWu")

注意三: 默认参数

func show(_ name: String = "ZhangSan") {
    print(name)
}
show()

注意四: 无限形参

func add(numbers: Int...) -> Int {
    var tmp = 0
    for item in numbers {
        tmp += item
    }
    return tmp
}
add(numbers: 1, 2, 3, 4)

注意五: 引用传递

Swift 默认是采用 值传递,若想要修改传入的参数,则需要采用 引用传递

func show(input number: inout Int) {
    print("input 1: \(number)")
    number += 1
    print("input 2: \(number)")
}

var num = 10
show(input: &num)
print("input 3: \(num)")

使用技巧

类似于 数据类型,函数也是有类型的,它默认是 引用类型,并且可以像 Int Double 一样来使用。

func add(a: Int, b: Int) -> Int {
    return a + b;
}

var mathFunction: (Int, Int) -> Int = add

var result = mathFunction(10, 20)
print(result)

因此,函数也可以作为其它函数的参数

func add(a: Int, b: Int) -> Int {
    return a + b;
}

func calc(a: Int, b: Int, calcMethod: (Int, Int) -> Int) {
    print(calcMethod(a, b))
}

calc(a: 10, b: 20, calcMethod: add)

同样,函数也可以作为其它函数的返回值

func add(a: Int, b: Int) -> Int {
    return a + b
}
func add(a: Int, b: Int) -> Int {
    return a * b
}

func getResult(a: Int) -> (Int, Int) -> Int {
    if a > 10 {
        return add
    } else {
        return multiply
    }
}

var addResult = getResult(a: 2)(10, 20)
var multiplyResult = getResult(a: 12)(10, 20)

闭包

例子

计算一个数的平方

// 函数写法
func square(param: Int) -> Int {
    return param * param
}
square(param: 3)

// 闭包写法
let squareCloure = { (param: Int) -> Int in
    return param * param
}
squareCloure(3)

概念

闭包,又称为 匿名函数回调。在网络请求中经常用到,主要用于异步请求。

知识点

参数简写

// 例子: 根据给定的数组和表达式返回新的数组
func getList(score: [Int], con: (Int) -> Bool) -> [Int] {
    var newScore: [Int] = [Int]()
    for item in score {
        if con(item) {
            newScore.append(item)
        }
    }
    return newScore
}

let newArray = getList(score: [74, 10, 20, 90, 83], con: {
    (s: Int) -> Bool in return s > 80
})
  1. 简写一: 省略 -> 与返回类型

根据表达式返回值自动判断

let newArray = getList(score: [74, 10, 20, 90, 83], con: { (s: Int) in return s > 80 })
  1. 简写二: 省略参数类型和括号

根据函数的参数自动推断参数类型

let newArray = getList(score: [74, 10, 20, 90, 83], con: { s in return s > 80 })
  1. 简写三: 省略 return 关键字
let newArray = getList(score: [74, 10, 20, 90, 83], con: { s in s > 80 })
  1. 简写四: 省略参数名称和 in 关键字
let newArray = getList(score: [74, 10, 20, 90, 83], con: { $0 > 80 })
Responses