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-闭包的更多相关文章

  1. swift开发学习笔记-闭包

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jiangqq781931404/article/details/32913421 文章转自:http ...

  2. Swift语法基础入门三(函数, 闭包)

    Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: ...

  3. swift开发多线程篇 - 多线程基础

    swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread  使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...

  4. Swift语法基础入门一(适合有C, OC开发人员)

    Swift开发体验 /*: 创建对象 * OC: alloc initWithXXX 方法 * Swift: (xxx:) */ /*: 调用方法 * OC: [UIColor redColor]; ...

  5. iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包

    本文章将从两个方向分别介绍 OC 与 swift 混编 1. 第一个方向从 swift工程 中引入 oc类 1. 1 如何在swift的类中使用oc类    1.2  如何在swift中实现oc的代理 ...

  6. Swift零基础教程2019最新版(一)搭建开发环境

    Swift简单介绍 Swift是苹果强力推荐的新型开发语言,能开发苹果下属所有软件平台(iOS,iPadOS,macOS,watchOS,tvOS)初学者如果想进入苹果的开发体系,从Swift开始学习 ...

  7. 《Swift开发指南》

    <Swift开发指南> 基本信息 作者: 关东升    赵志荣 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115366245 上架时间:2014-8-5 出版日期:20 ...

  8. 《Swift开发指南》国内第一本Swift图书上市了

    <Swift开发指南>国内第一本Swift图书上市了 既<courseId=799262">苹果Swift编程语言开发指南>视频教程地址:courseId=79 ...

  9. 智捷公开课马上开始了-欢迎大家一起讨论学习-第一系列读《Swift开发指南(修订版) 》看Swift视频教程

    引用: 智捷课堂携手51CTO学院.图灵教育联合举办iOS线上培训就业班系列体验公开课. 分享移动开发.移动设计方向最新,最热,最抢眼技术热点以及设计经验.我们每周将最少举办一次公开课,同时会提前安排 ...

  10. 关于《Swift开发指南》背后的那些事

    时间轴(倒叙)2014年8月底在图灵出版社的大力支持下,全球第一本全面.系统.科学的,包含本人多年经验的呕心沥血之作<Swift开发指南>(配有同步视频课程和同步练习)全线重磅推出2014 ...

随机推荐

  1. C#开发的股票盯盘小工具——摸鱼助手,附源码

    写了个盯盘小工具,最近发现很多炒股的小伙伴,上班期间看手机频繁是不是影响不好?电脑上打开交易软件,那影响是不是更不好?所以我就写了个小工具,给大家"摸鱼"用.虽然是摸鱼用,但是平常 ...

  2. Aspire项目发布到远程k8s集群

    前提 你必须会创建aspire项目,不会的请先看微服务新体验之Aspire初体验 Aspirate (Aspir8) Aspirate 是将aspire项目发布到k8s集群的工具 安装aspirate ...

  3. NOIP模拟65

    T1 网格图 解题思路 60pts 就是个zz做法..(我考场上造了一个 \(500\times 500\) 的 X,一看挺快,就以为 \(n^4\) 可以切,然而..) 正解有一点难度,对于每一个节 ...

  4. 【论文笔记】ResNet深度残差网络

    [深度学习]总目录 深度残差网络(ResNet)由微软研究院的何恺明.张祥雨.任少卿.孙剑提出.研究动机是为了解决深度网络的退化问题,不同于过去的网络是通过学习去拟合一个分布,ResNet通过学习去拟 ...

  5. css作用 文本属性 颜色属性

    Css作用:美化页面 各种css属性 接触的 css属性 width: height: background: Color 选择符和声明 声明包括 属性:属性值 选择符:{ 属性:属性值 } 1:文本 ...

  6. kettle从入门到精通 第二十九课 job 循环 检验字段的值

    1.平常我们在用kettle设计job的时候,会用到循环来处理一些业务逻辑,比如循环检测某个表中的数据条数等.这个时候就会用到一个特别重要的步骤:检验字段的值. 下图是一个的通过初始化DNOE变量为f ...

  7. kali linux主题美化

    Kali 主题美化 先放张安装了主题的图片: 执行下面命令下载主题文件: git clone https://github.com/daniruiz/flat-remix-gtk.git git cl ...

  8. C#.NET 使用Task.Run和Task.Delay 延时执行任务(代码)

    C#.NET 使用Task.Run和Task.Delay 延时执行任务(代码) 环境: .NET 4.5.2 .NET WEB MVC + WEB API. 示例代码: using CommonUti ...

  9. [DP] DP优化总结

    写在前面 $ DP $,是每个信息学竞赛选手所必会的算法,而 $ DP $ 中状态的转移又显得尤为关键.本文主要从状态的设计和转移入手,利用各种方法对朴素 $ DP $ 的时间复杂度和空间复杂度进行优 ...

  10. win10系统,磁盘出现惊叹号和一把锁符号如何关闭去掉

    如标题描述,图标如下 解决方法如下:搜索cmd -> 以管理员身份运行 输入命令如下 根据c,d,e盘符的文件量大小执行时间有些差异. manage-bde -off c:就可以解密c盘,成为b ...