面试题答案
一键面试Swift 闭包的特性
- 自包含功能块:闭包是一个自包含的代码块,可以在代码中被传递和调用。它可以捕获和存储其所在上下文中任意常量和变量的引用,这就是所谓的“闭合并包裹”这些常量和变量,因此被称为闭包。
- 简洁语法:Swift 提供了简洁的闭包表达式语法,使代码更加紧凑和易读。例如可以使用尾随闭包、简写参数名等语法糖。
- 作为一等公民:闭包在 Swift 中是一等公民,意味着它可以像其他数据类型(如 Int、String 等)一样被赋值给变量、作为函数参数传递以及从函数中返回。
利用闭包优化代码性能
- 避免不必要的计算 通过闭包的延迟执行特性,只有在真正需要结果时才进行计算,从而避免不必要的计算。 示例代码:
func expensiveCalculation() -> Int {
print("Performing expensive calculation...")
return 42
}
var result: () -> Int = {
return expensiveCalculation()
}
// 此时并没有执行 expensiveCalculation 函数
print("Before evaluating the result")
let finalResult = result()
// 这里才执行 expensiveCalculation 函数
print("Final result: \(finalResult)")
解释:result
是一个闭包,它将 expensiveCalculation
函数的调用包裹起来。在闭包被调用之前,expensiveCalculation
函数不会执行,这样如果在某些情况下,这个结果永远不需要,就避免了昂贵的计算。
- 减少内存开销 通过逃逸闭包和自动闭包的合理使用来减少内存开销。例如,自动闭包可以延迟表达式的求值,从而在不需要该值时节省内存。 示例代码:
func logValue(_ valueProvider: @autoclosure () -> Int) {
if someCondition {
let value = valueProvider()
print("Value: \(value)")
}
}
let expensiveValue = calculateExpensiveValue()
// calculateExpensiveValue 是一个昂贵的计算函数
logValue(expensiveValue)
解释:@autoclosure
关键字将 expensiveValue
表达式自动转化为一个闭包。只有当 someCondition
为 true
时,valueProvider()
才会被调用,计算 expensiveValue
,如果 someCondition
为 false
,则不会计算 expensiveValue
,从而减少了不必要的内存开销。