MST

星途 面试题库

面试题:Swift中的闭包与函数的区别

请阐述在Swift中闭包和函数在定义、使用场景、捕获变量等方面有哪些区别,并分别给出一个简单的示例代码。
40.4万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试

定义区别

  • 函数:是一段有名字的可执行代码块,使用 func 关键字定义,有明确的参数列表和返回值类型声明。
func addNumbers(a: Int, b: Int) -> Int {
    return a + b
}
  • 闭包:是一个自包含的代码块,可以在代码中传递和使用。有三种形式,全局函数是一种不捕获任何值的闭包,嵌套函数是可以捕获其封闭函数内变量的闭包,而闭包表达式是一种轻量级语法构建内联闭包。
let closure = { (a: Int, b: Int) -> Int in
    return a + b
}

使用场景区别

  • 函数:适用于定义可复用的、有明确功能和命名的代码块,一般在整个程序中多处调用。例如,计算两个数之和这样通用的功能。
let result1 = addNumbers(a: 3, b: 5)
print(result1) 
  • 闭包:常用于需要将一段代码作为参数传递给其他函数的场景,例如 mapfiltersorted 等高阶函数。也用于延迟执行代码。
let numbers = [1, 2, 3, 4, 5]
let squaredNumbers = numbers.map { $0 * $0 }
print(squaredNumbers) 

捕获变量区别

  • 函数:通常不捕获外部变量,除非在函数内部定义了静态变量。函数参数和局部变量在函数调用结束后通常会被释放。
func increment() {
    var count = 0
    count += 1
    print(count) 
}
increment() 
  • 闭包:可以捕获其定义时所在作用域中的变量,即使这些变量在闭包定义之后超出了其原始作用域,闭包捕获的变量依然可以被访问和修改。
func makeIncrementer() -> () -> Int {
    var count = 0
    let incrementClosure: () -> Int = {
        count += 1
        return count
    }
    return incrementClosure
}
let incrementer = makeIncrementer()
print(incrementer()) 
print(incrementer())