Swift开发基础06-闭包

swift · 浏览次数 : 1

小编点评

Swift闭包是一种强大的功能,允许将代码块和上下文结合在一起。它们可以捕获并保留上下文中的变量和常量。闭包有三种形式:全局函数、嵌套函数和闭包表达式。闭包表达式语法为:`{ (parameters) -> returnType in statements}`。 以下是一些闭包使用示例: 1. **基本闭包**: ```swift let simpleClosure = { print("Hello, Swift Closure!") } simpleClosure() // 输出: "Hello, Swift Closure!" ``` 2. **带参数和返回值的闭包**: ```swift let sumClosure = { (a: Int, b: Int) -> Int in return a + b } let result = sumClosure(3, 5) print(result) // 输出: 8 ``` 3. **作为参数传递的闭包**: ```swift func performOperation(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int { return operation(a, b) } let result = performOperation(a: 10, b: 20, operation: { (x, y) -> Int in return x * y }) print(result) // 输出: 200 ``` 4. **尾随闭包**: ```swift func performOperation(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int { return operation(a, b) } let result = performOperation(a: 10, b: 20) { (x, y) -> Int in return x * y } print(result) // 输出: 200 ``` 5. **捕获值闭包**: ```swift func makeIncrementer(incrementAmount: Int) -> () -> Int { var total = 0 let incrementer: () -> Int = { total += incrementAmount return total } return incrementer } let incrementByTwo = makeIncrementer(incrementAmount: 2) print(incrementByTwo()) // 输出: 2 print(incrementByTwo()) // 输出: 4 ``` 6. **自动闭包**: ```swift var array = [1, 2, 3] func removeFirstElement(array: @autoclosure () -> Int?) -> Int? { return array() } let firstElement = removeFirstElement(array: array.removeFirst()) print(firstElement ?? "Array is empty") // 输出: 1 ``` 7. **逃逸闭包(Escaping Closures)**: ```swift var completionHandlers: [() -> Void] = [] func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) { completionHandlers.append(completionHandler) } someFunctionWithEscapingClosure { print("This is an escaping closure") } // 代码稍后执行completionHandlers.first?() // 输出: "This is an escaping closure" ``` 这些示例展示了Swift闭包在不同场景下的应用。通过理解闭包的概念和用法,你可以更有效地使用它们来优化代码和提高程序的灵活性。

正文

Swift的闭包(Closures)是一种将功能块和上下文整合并演示在代码中的一种手段。闭包可以捕获并存储其上下文中的变量和常量。与普遍存在于其他语言的匿名函数(如Python的lambda、JavaScript的函数表达式)类似,Swift的闭包提供了强大的功能,并在很多场景中替代了函数。

闭包有三种主要形式:

  1. 全局函数:有名字但不捕获任何值。
  2. 嵌套函数:有名字并能捕获其封闭函数内的值。
  3. 闭包表达式:无名字,可以从其上下文中捕获值。

闭包表达式语法

闭包表达式语法是构建闭包的一种方式,包含一个参数列表,一个返回类型和闭包的主体:

 
{ (parameters) -> returnType in
    statements
}

让我们一步步通过示例探讨一下闭包的使用情形。

示例:最基本的闭包

 
let simpleClosure = {
    print("Hello, Swift Closure!")
}

simpleClosure() // 输出: "Hello, Swift Closure!"

示例:带参数和返回值的闭包

 
let sumClosure = { (a: Int, b: Int) -> Int in
    return a + b
}

let result = sumClosure(3, 5)
print(result) // 输出: 8

示例:作为参数传递闭包

闭包经常作为参数传递给函数,比如用作回调函数。

 
func performOperation(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int {
    return operation(a, b)
}

let result = performOperation(a: 10, b: 20, operation: { (x, y) -> Int in
    return x * y
})
print(result) // 输出: 200

示例:尾随闭包

如果闭包是函数的最后一个参数,那么可以使用尾随闭包的语法来书写:

 
func performOperation(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int {
    return operation(a, b)
}

let result = performOperation(a: 10, b: 20) { (x, y) -> Int in
    return x * y
}
print(result) // 输出: 200

示例:闭包捕获值

闭包可以捕获并存储其上下文中的变量值,这被称为“捕获”。

 
func makeIncrementer(incrementAmount: Int) -> () -> Int {
    var total = 0
    
    let incrementer: () -> Int = {
        total += incrementAmount
        return total
    }
    
    return incrementer
}

let incrementByTwo = makeIncrementer(incrementAmount: 2)

print(incrementByTwo()) // 输出: 2
print(incrementByTwo()) // 输出: 4

示例:自动闭包

自动闭包是一种自动捕获表达式的闭包,多用于延时计算和副作用控制。

swift
复制代码
var array = [1, 2, 3]

func removeFirstElement(array: @autoclosure () -> Int?) -> Int? {
    return array()
}

let firstElement = removeFirstElement(array: array.removeFirst())
print(firstElement ?? "Array is empty") // 输出: 1

示例:逃逸闭包(Escaping Closures)

当闭包在函数返回之后还被调用时,需要将其标记为@escaping

swift
复制代码
var completionHandlers: [() -> Void] = []

func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}

someFunctionWithEscapingClosure {
    print("This is an escaping closure")
}

// 代码稍后执行
completionHandlers.first?() // 输出: "This is an escaping closure"

这些示例涵盖了Swift闭包的基础和一些高级场景。

与Swift开发基础06-闭包相似的内容:

Swift开发基础06-闭包

Swift的闭包(Closures)是一种将功能块和上下文整合并演示在代码中的一种手段。闭包可以捕获并存储其上下文中的变量和常量。与普遍存在于其他语言的匿名函数(如Python的lambda、JavaScript的函数表达式)类似,Swift的闭包提供了强大的功能,并在很多场景中替代了函数。 闭包有

Swift开发基础08-高阶函数

高阶函数是指接受其它函数作为参数,或者返回其它函数的函数。Swift 提供了许多内置的高阶函数,这些函数在处理集合类型数据(如数组、集合等)时尤其有用。常见的高阶函数包括 map、filter、reduce、flatMap 和 compactMap。 一、常用高阶函数 1. map map 函数会对

iOS开发基础109-网络安全

在iOS开发中,保障应用的网络安全是一个非常重要的环节。以下是一些常见的网络安全措施及对应的示例代码: Swift版 1. 使用HTTPS 确保所有的网络请求使用HTTPS协议,以加密数据传输,防止中间人攻击。 示例代码: 在Info.plist中配置App Transport Security (

Swift之struct二进制大小分析

随着Swift的日渐成熟和给开发过程带来的便利性及安全性,京喜App中的原生业务模块和基础模块使用Swift开发占比逐渐增高。本次讨论的是struct对比Class的一些优劣势,重点分析对包体积带来的影响及规避措施。

详解神经网络基础部件BN层

摘要:在深度神经网络训练的过程中,由于网络中参数变化而引起网络中间层数据分布发生变化的这一过程被称为内部协变量偏移(Internal Covariate Shift),而 BN 可以解决这个问题。 本文分享自华为云社区《神经网络基础部件-BN层详解》,作者:嵌入式视觉 。 一,数学基础 1.1,概率

windows离线部署VSCode在Centos7上的远程开发环境

前言 公司一直使用的是ssh+vim的远程开发方式,习惯了vim之后已经非常方便了。但是还是想尝试一下VSCode的开发方式。就我而言,原因如下 漂亮的语法高亮,并且有补全 基于语法解析的引用查找(尽管在我们项目的场景下还是一坨翔) Ctrl+Shift+F的快速搜索 可视化调试,可以直接在代码中下

教你2种方法,将iOS设备通过MQTT协议连接到华为云物联网平台

本文讲述如何使用Flutter和Swift两种开发语言连接到华为云物联网平台。

万字长文详解如何使用Swift提高代码质量

京喜APP最早在2019年引入了Swift,使用Swift完成了第一个订单模块的开发。之后一年多我们持续在团队/公司内部推广和普及Swift,目前Swift已经支撑了70%+以上的业务。通过使用Swift提高了团队内同学的开发效率,同时也带来了质量的提升,目前来自Swift的Crash的占比不到1%。在这过程中不断的学习/实践,团队内的Code Review,也对如何使用Swift来提高代码质量有更深的理解。

作为移动开发你不能不了解的编译流程

阅读本文,或许能够了解关于以下的几个问题: 1、编译器是什么?为什么会有编译器这样一个东西? 2、编译器做了哪些工作?整个编译过程又是什么? 3、Apple的编译器发展历程以及为什么会抛弃GCC换成自研的LLVM? 4、从编译器角度看Swift与OC能够实现混编的底层逻辑

Swift中UITableViewDiffableDataSource的使用

在 iOS 13 中 Apple 为 UITableView 和 UICollectionView 引入了 DiffableDataSource, 让开发者可以更简单高效的实现 UITableView、UICollectionView 的局部数据刷新。 新的刷新的方法为 apply 通过使用 app