Swift-闭包,隐式返回、尾随闭包、值捕获、逃逸闭包、自动闭包

Swift ——闭包 之前在代码的书写过程中,我们已经或多或少的接触过函数,函数本身也有自己的类型,它由形式参数类型,返回类型组成。如果将函数传递给a变量,那么就可以借助a来调用方法,这里addTwoInts代表函数类型。如果出现了同名函数,但是返回值或者参数不一样,那么就需要指明函数类型。否则就会报 ambiguous user of *** 错误,因为这个时候编译器不知道要给a赋值哪一个参数。把函数赋值给a,那么a里面储存的是什么呢? 运行后打印a,这里看懂存储的是函数类型.这里函数类型也是引用类型,当把函数赋值给a的时候, 阅读详情

闭包

闭包可以捕获和存储其所在上下文中任意常量和变量的引用,被称为包裹常量和变量。
Swift 会为你管理在捕获过程中涉及到的所有内存操作。

全局和嵌套函数实际上也是特殊的闭包,闭包采用如下三种形式之一:

  • 全局函数是一个有名字但不会捕获任何值的闭包。
  • 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包。
  • 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的匿名闭包。

Swift 的闭包表达式拥有简洁的风格,并在常见场景中进行语法优化,主要优化如下:

  • 利用上下文推断参数和返回值类型
  • 隐式返回单表达式闭包,即单表达式闭包可以省略 return 关键字
  • 参数名称缩写
  • 尾随闭包语法

1. 闭包表达式

1.1 排序方法

  • Swift 标准库提供了名为 sorted(by:) 的方法,它会基于你提供的排序闭包表达式的判断结果对数组中的值(类型确定)进行排序。
  • 一旦它完成排序过程,sorted(by:) 方法会返回一个与旧数组类型大小相同类型的新数组,该数组的元素有着正确的排序顺序。
  • 原数组不会被 sorted(by:) 方法修改。
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func backward(_ s1: String, _ s2: String) -> Bool {
    return s1 > s2
}
var reversedNames = names.sorted(by: backward)  // reversedNames 为 ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
注意
    1. 如果第一个字符串(s1)大于第二个字符串(s2),backward(_:_:) 函数会返回 true,表示在新的数组中 s1 应该出现在 s2 前。
    2. 对于字符串中的字符来说,“大于”表示“按照字母顺序较晚出现”。这意味着字母 "B" 大于字母 "A" ,字符串 "Tom" 大于字符串 "Tim"。
    3. 该闭包将进行字母逆序排序,"Barry" 将会排在 "Alex" 之前

1.2 闭包表达式语法

一般形式:

{ (parameters) -> return type in
    statements
}
  • 闭包表达式参数 可以是 in-out 参数,但不能设定默认值。
  • 如果你命名了可变参数,也可以使用此可变参数。
  • 元组也可以作为参数和返回值。
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})
  • 闭包的函数体部分由关键字 in 引入。
  • 该关键字表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始。

由于这个闭包的函数体部分如此短,以至于可以将其改写成一行代码:

reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 } )
该例中 sorted(by:) 方法的整体调用保持不变,一对圆括号仍然包裹住了方法的整个参数。然而,参数现在变成了内联闭包。

1.3 根据上下文推断类型

  • 因为排序闭包函数是作为 sorted(by:) 方法的参数传入的,Swift 可以推断其参数和返回值的类型。
  • sorted(by:) 方法被一个字符串数组调用,因此其参数必须是 (String, String) - > Bool 类型的函数。
  • 意味着 (String, String) 和 Bool 类型并不需要作为闭包表达式定义的一部分,因为所有的类型都可以被正确推断,返回箭头(->)和围绕在参数周围的括号也可以被省略:
reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )

1.4 单表达式闭包的隐式返回

单行表达式闭包可以通过省略 return 关键字来隐式返回单行表达式的结果:

reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
注意:
    1. sorted(by:) 方法的参数类型明确了闭包必须返回一个 Bool 类型值。
    2. 因为闭包函数体只包含了一个单一表达式(s1 > s2),该表达式返回 Bool 类型值。
    3. 因此这里没有歧义,return 关键字可以省略。

1.5 参数名称缩写

Swift 自动为内联闭包提供了参数名称缩写功能。

  • 在闭包表达式中使用参数名称缩写,你可以在闭包定义中省略参数列表,并且对应参数名称缩写的类型会通过函数类型进行推断。
  • in 关键字也同样可以被省略,因为此时闭包表达式完全由闭包函数体构成:
reversedNames = names.sorted(by: { $0 > $1 } )
注意:$0 和 $1 表示闭包中第一个和第二个 String 类型的参数。

1.6 运算符方法

  • Swift 的 String 类型定义了关于大于号(>)的字符串实现,其作为一个函数接受两个 String 类型的参数并返回 Bool 类型的值。
  • 这正好与 sorted(by:) 方法的参数需要的函数类型相符合。
  • 因此,你可以简单地传递一个大于号,Swift 可以自动推断找到系统自带的那个字符串函数的实现:
reversedNames = names.sorted(by: >)

2. 尾随闭包

  • 尾随闭包是一个书写在函数圆括号之后的闭包表达式。
  • 函数支持将其作为最后一个参数调用。
  • 在使用尾随闭包时,你不用写出它的参数标签。
func someFunctionThatTakesAClosure(closure: () -> Void) {
    // 函数体部分
}

// 以下是不使用尾随闭包进行函数调用
someFunctionThatTakesAClosure(closure: {
    // 闭包主体部分
})

// 以下是使用尾随闭包进行函数调用
someFunctionThatTakesAClosure() {
    // 闭包主体部分
}
  • 字符串排序闭包可以作为尾随包的形式改写在 sorted(by:) 方法圆括号的外面:
reversedNames = names.sorted() { $0 > $1 }
  • 如果闭包表达式是函数或方法的唯一参数,则当你使用尾随闭包时,你甚至可以把 () 省略掉:
reversedNames = names.sorted { $0 > $1 }
  • Swift 的 Array 类型有一个 map(_:) 方法,这个方法获取一个闭包表达式作为其唯一参数。
  • 该闭包函数会为数组中的每一个元素调用一次,并返回该元素所映射的值。
  • 具体的映射方式和返回值类型由闭包来指定。
let digitNames = [
    0: "Zero", 1: "One", 2: "Two",   3: "Three", 4: "Four",
    5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]   //  一个整型数位和它们英文版本名字相映射的字典
let numbers = [16, 58, 510] //  准备转换为字符串数组的整型数组

let strings = numbers.map {
    (number) -> String in
    var number = number
    var output = ""
    repeat {
        output = digitNames[number % 10]! + output
        number /= 10
    } while number > 0
    return output
}
// strings 常量被推断为字符串类型数组,即 [String]
// 其值为 ["OneSix", "FiveEight", "FiveOneZero"]

map(_ : ) 为数组中每一个元素调用了一次闭包表达式。
不需要指定闭包的输入参数 number 的类型,因为可以通过要映射的数组类型进行推断。
在该例中,局部变量 number 的值由闭包中的 number 参数获得,因此可以在闭包函数体内对其进行修改,(闭包或者函数的参数总是常量),闭包表达式指定了返回类型为 String,以表明存储映射值的新数组类型为 String。

注意
    1. 字典 digitNames 下标后跟着一个叹号(!),因为字典下标返回一个可选值(optional value),表明该键不存在时会查找失败。
    2. 在上例中,由于可以确定 number % 10 总是 digitNames 字典的有效下标,因此叹号可以用于强制解包(force-unwrap)存储在下标的可选类型的返回值中的 String 类型的值。

3. 值捕获

  • 闭包可以在其被定义的上下文中捕获常量或变量。
  • 即使定义这些常量和变量的原作用域已经不存在,闭包仍然可以在闭包函数体内引用和修改这些值。
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementer() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementer
}
  1. makeIncrementer 返回类型为 () -> Int。这意味着其返回的是一个函数,而非一个简单类型的值。
  2. 该函数在每次调用时不接受参数,只返回一个 Int 类型的值。
let incrementByTen = makeIncrementer(forIncrement: 10)
incrementByTen()    // 返回的值为10
incrementByTen()    // 返回的值为20
incrementByTen()    // 返回的值为30

let incrementBySeven = makeIncrementer(forIncrement: 7)
incrementBySeven()  // 返回的值为7

定义了一个叫做 incrementByTen 的常量
该常量指向一个每次调用会将其 runningTotal 变量增加 10 的 incrementer 函数

注意:
    1. 如果你将闭包赋值给一个类实例的属性,并且该闭包通过访问该实例或其成员而捕获了该实例,你将在闭包和该实例间创建一个循环强引用。
    2. Swift 使用捕获列表来打破这种循环强引用。

4. 闭包是引用类型

  • incrementBySeven 和 incrementByTen 都是常量,但是这些常量指向的闭包仍然可以增加其捕获的变量的值。这是因为函数和闭包都是引用类型。
  • 无论你将函数或闭包赋值给一个常量还是变量,你实际上都是将常量或变量的值设置为对应函数或闭包的引用。
  • 上面的例子中,指向闭包的引用 incrementByTen 是一个常量,而并非闭包内容本身。
  • 这也意味着如果你将闭包赋值给了两个不同的常量或变量,两个值都会指向同一个闭包:
let alsoIncrementByTen = incrementByTen
alsoIncrementByTen()    // 返回的值为50

5. 逃逸闭包

  • 当一个闭包作为参数传到一个函数中,但是这个闭包在函数返回之后才被执行,我们称该闭包从函数中逃逸。
  • 当你定义接受闭包作为参数的函数时,你可以在参数名之前标注 @escaping,用来指明这个闭包是允许“逃逸”出这个函数的。
  • 一种能使闭包“逃逸”出函数的方法是,将这个闭包保存在一个函数外部定义的变量中。
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}
  1. someFunctionWithEscapingClosure(_:) 函数接受一个闭包作为参数,该闭包被添加到一个函数外定义的数组中。
  2. 如果你不将这个参数标记为 @escaping,就会得到一个编译错误。
func someFunctionWithNonescapingClosure(closure: () -> Void) {
    closure()
}

class SomeClass {
    var x = 10
    func doSomething() {
        someFunctionWithEscapingClosure { self.x = 100 }
        someFunctionWithNonescapingClosure { x = 200 }
    }
}

let instance = SomeClass()
instance.doSomething()
print(instance.x)   // 打印出“200”

completionHandlers.first?()
print(instance.x)   // 打印出“100”
  1. 将一个闭包标记为 @escaping 意味着你必须在闭包中显式地引用 self。
  2. 传递到 someFunctionWithEscapingClosure(_:) 中的闭包是一个逃逸闭包,这意味着它需要显式地引用 self。
  3. 相对的,传递到 someFunctionWithNonescapingClosure(_:) 中的闭包是一个非逃逸闭包,这意味着它可以隐式引用 self。

6. 自动闭包

  • 自动闭包是一种自动创建的闭包,用于包装传递给函数作为参数的表达式。
  • 这种闭包不接受任何参数,当它被调用的时候,会返回被包装在其中的表达式的值。
  • 这种便利语法让你能够省略闭包的花括号,用一个普通的表达式来代替显式的闭包。
  • 自动闭包让你能够延迟求值,因为直到你调用这个闭包,代码段才会被执行。
  • 延迟求值对于那些有副作用(Side Effect)和高计算成本的代码来说是很有益处的,因为它使得你能控制代码的执行时机。
var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
print(customersInLine.count)    // 打印出“5”

let customerProvider = { customersInLine.remove(at: 0) }
print(customersInLine.count)    // 打印出“5”

print("Now serving \(customerProvider())!") // Prints "Now serving Chris!"
print(customersInLine.count)    // 打印出“4”

在闭包的代码中,customersInLine 的第一个元素被移除了,不过在闭包被调用之前,这个元素是不会被移除的。
如果这个闭包永远不被调用,那么在闭包里面的表达式将永远不会执行,那意味着列表中的元素永远不会被移除。

注意:
    1. 注意,customerProvider 的类型不是 String,而是 () -> String。
    2. 一个没有参数且返回值为 String 的函数。
  • 将闭包作为参数传递给函数时,你能获得同样的延时求值行为。
//  serve(customer:) 函数接受一个返回顾客名字的显式的闭包。
func serve(customer customerProvider: () -> String) {
    print("Now serving \(customerProvider())!")
}
serve(customer: { customersInLine.remove(at: 0) } )
// 打印出“Now serving Alex!”
  • 通过将参数标记为 @autoclosure 来接收一个自动闭包。
  • 可以将该函数当作接受 String 类型参数(而非闭包)的函数来调用。
  • customerProvider 参数将自动转化为一个闭包,因为该参数被标记了 @autoclosure 特性。
func serve(customer customerProvider: @autoclosure () -> String) {
    print("Now serving \(customerProvider())!")
}
serve(customer: customersInLine.remove(at: 0))
注意:
    1. 过度使用 autoclosures 会让你的代码变得难以理解。
    2. 上下文和函数名应该能够清晰地表明求值是被延迟执行的。
  • 如果你想让一个自动闭包可以“逃逸”,则应该同时使用 @autoclosure 和 @escaping 属性。
// customersInLine i= ["Barry", "Daniella"]
var customerProviders: [() -> String] = []
func collectCustomerProviders(_ customerProvider: @autoclosure @escaping () -> String) {
    customerProviders.append(customerProvider)
}
collectCustomerProviders(customersInLine.remove(at: 0))
collectCustomerProviders(customersInLine.remove(at: 0))

print("Collected \(customerProviders.count) closures.") // 打印“Collected 2 closures.”
for customerProvider in customerProviders {
    print("Now serving \(customerProvider())!")
}
// 打印“Now serving Barry!”
// 打印“Now serving Daniella!”
  1. collectCustomerProviders(_ : ) 函数并没有调用传入的 customerProvider 闭包,而是将闭包追加到了 customerProviders 数组中。
  2. 这个数组定义在函数作用域范围外,这意味着数组内的闭包能够在函数返回之后被调用。
  3. 因此,customerProvider 参数必须允许“逃逸”出函数作用域。
Swift之深入解析闭包Closures的使用和捕获变量的原理 一、Closures 简介 ① 什么是闭包? 闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。 闭包是一个捕获了全局上下文的常量或者变量的函数,通俗来讲,闭包可以是常量也可以是函数。全局函数和嵌套函数其实就是特殊的闭包。 闭包的形式有: 全局函数:有名字但不能捕获任何值; 嵌套函数:有名字,也能捕获封闭函数内的值; 闭包表达式: 阅读详情

相关推荐

Multisim仿真电路:(十二)MOS管缓启动电路设计与优化

本文详细介绍了基于Multisim的MOS管缓启动电路设计与优化方法。通过分析米勒平台效应,探讨RC参数选择、多级设计和有源电路等技巧,有效抑制冲击电流并优化开关损耗。文章结合仿真实例,提供实用的设计策略和实际应用注意事项,帮助工程师提升电源管理系统的可靠性。

pytorch8learner的博客 237

Swift学习(八):闭包(闭包表达式,尾随闭包,闭包的定义,自动闭包)

闭包表达式(Closure Expression) 可以通过func定义一个函数,也可以通过闭包表达式定义一个函数 func函数 闭包定义函数 闭包表达式调用可以直接省略参数名 闭包定义函数也可以写为: 闭包表达式的结构 闭包表达式的简写 尾随闭包 如果将一个很长的闭包表达式作为函数的最后一个实参,使用尾随闭包可以增强函数的可读性 尾随闭包是一个被书写在函数调用...

weixin_42433480的博客 1900

关于Vscode配置Unity环境时的一些报错问题(持续更新)

3.找到设置文件,添加如下代码,用于告诉VSCode)在处理 C# 项目时优先使用 C# 扩展来加载和管理项目,而不是使用 C# Dev Kit 或其他扩展。1.很可能是unity的插件版本问题,打开window > package manager将。2.很可能是项目文件的问题,建议unity打开edit > perfercenes。3.手动重装其他版本的.Net框架(去官网找,多下几个无所谓的)解决:(由于造成问题不一样,所以建议都尝试一次)下载net请求超时(一般都会超时很正常的)

bug制造机 1889

Swift知识点(二)

通过汇编打断点,可以看出在Swift中调用OC的方法,还是使用的runtime那一套在OC中调用Swift的方法函数,由于已经是继承NSObject,因此,还是走的runtime那一套。

IOSSHAN的博客 1738

新手避坑指南:在MacBook上为PyTorch正确配置MPS环境,跑通第一个YOLOv8训练

本文详细指导新手如何在MacBook上为PyTorch正确配置MPS环境,并成功运行YOLOv8训练。从环境准备、PyTorch安装到YOLOv8配置和性能调优,提供全面的避坑指南和实用技巧,帮助开发者充分利用Mac的GPU加速能力。

weixin_29100399的博客 229

Unity 升级 xLua 版本,编译不同平台链接库

Unity 升级 xLua 详解

LymanCao的专栏 1802

swift那些事儿 尾随闭包

尾随闭包:一个无名函数(闭包)作为一个参数传给一个正常的函数 func methondName(参数1: String, 参数2: String, 闭包closure: (closure的参数1,closure的参数2) -> closure的返回值类型) -> 函数的返回值类型 { //函数结束时正常调用自身参数->闭包函数 return closure(参...

我的博客 3638

H3C交换机S-MLAG实战:如何用bond4模式实现服务器高可用(附避坑指南)

本文详细介绍了H3C交换机S-MLAG技术与服务器bond4模式的实战配置,帮助实现跨设备链路聚合的服务器高可用方案。通过解析S-MLAG技术优势、bond4模式选择、关键配置步骤及常见问题排查,提供了一套完整的避坑指南和优化建议,适用于企业级网络架构的高可用需求。

weixin_30790841的博客 466

ArkTs中的尾随闭包

ArkTs中,组件后面的{}就是尾随闭包。在 ArkTS 中,当组件后面直接跟随 {} 大括号时,这种语法形式本质上就是​​尾随闭包​​的应用。但需结合具体场景理解其作用机制,以下是详细解析:

Hello_MyDream的博客 709

10X Genomics数据实战:手把手教你用Seurat处理单细胞PBMC数据(附完整代码)

本文详细介绍了如何使用Seurat处理10X Genomics的单细胞PBMC数据,从数据获取、质控到降维分析和细胞分群的全流程。通过实战代码演示,帮助研究者掌握单细胞RNA测序数据分析的核心技术,提升对细胞异质性的理解。

weixin_29053577的博客 254

CS算法实战:用MATLAB从零实现SAR点目标成像(附完整代码)

本文详细介绍了如何使用MATLAB从零实现SAR点目标CS成像算法,涵盖Chirp Scaling(CS)算法的核心理论、距离徙动校正(RCMC)和方位压缩等关键步骤。通过完整的代码示例和实战技巧,帮助读者掌握SAR成像处理算法,提升遥感图像处理能力。

weixin_29211309的博客 179

IOS11,Swift4从入门到精通-09闭包

本节内容转载于 http://www.swift51.com/swift4.0/chapter2/07_Closures.html 本页包含内容: 闭包表达式 尾随闭包 值捕获 闭包是引用类型 逃逸闭包 自动闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。 闭包可以...

liu_jiuyang的博客 406

Sqlserver2012评估期已过问题解决(启动数据库服务报错1705都是同样的问题,数据库过期未激活)

一、背景: 因为之前安装sqlserver2012忘记输入序列号,如今出现评估期已过的问题,前几天忙活半天,才解决,发现网 上叙述都非常凌乱,并且仅仅有大意,有的非常难操作。所以把我操作的过程和大家交流分享: 一定要有序列号的输入。不然会有很多其它的麻烦出现: 二、问题解决: 第一步:进入SQL2012配置工具中的安装中心。 第二步:再进入左側维护选项界面,然后选择选择版本号升级。 ...

堂前燕的博客 3267

Swift 闭包

必报是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)一级其他一些编程语言中的匿名函数(Lambdas)比较相似。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。被称为包裹常量和变量。Swift 会为你管理在捕获过程中涉及到的所有内存操作。在Swift 的闭包表达式拥有简洁的风格,并鼓励在常见场景中进行语法优化,主要优化如下return。

xiaoxiaobukuang的专栏 2089

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深入掌握 Swift 闭包:闭包表达式、值捕获与逃逸/自动闭包完整指南

**闭包(Closure)** 是 Swift 语言中最核心的功能块之一:它是可以在代码中传递和使用的独立功能块,类似于其他语言中的匿名函数、lambda 表达式和代码块。本文以《The Swift Programming Language(中文版)》的 [闭包章节](https://link.gitcode.com/i/38ec7193d6535c4fe42533a948c11735) 为主体,

gitblog_00537的博客 785

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Swift闭包:精简代码的神器

Swift闭包是自包含的函数代码块,支持捕获上下文变量。主要形式包括全局函数、嵌套函数和闭包表达式。Swift提供多种简化写法:类型推断、单表达式隐式返回、参数名称缩写和运算符方法。闭包可以捕获值,分为逃逸和非逃逸两种类型,还支持自动闭包延迟求值。实际应用中,闭包广泛用于高阶函数(map/filter/reduce)、异步回调和自定义排序等场景,如数组筛选和求和运算。这些特性使闭包成为Swift编程中的重要工具。

yinguer的博客 440

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

swift3.0闭包

闭包        闭包是自包含的功能块,可以在代码中传递和使用        闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用。Swift处理所有的捕获的内存管理。 全局函数和嵌套函数实际上是闭包的特殊情况:     全局函数是具有名称并且不捕获任何值的闭包。     嵌套函数是具有名称的闭包,并且可以从其封闭函数捕获值。     1.闭包表达式    

LFYPhoenix的博客 501

Swift 5.1 (7) - 闭包

闭包是独立的函数块,可以在代码中传递和使用。Swift中的闭包类似于C和Objective-C中的block以及其他编程语言中的lambdas(匿名函数)。闭包可以捕获和存储上下文中定义的任何常量和变量的引用。 全局函数和嵌套函数实际上是闭包的特例。闭包采用以下三种形式之一: 全局函数是具有名称但不捕获任何值的闭包。 嵌套函数是具有名称并且可以从其封闭函数中捕获值的闭包。 Closure表达式是一...

微信-sjk6070 272

05-Swift闭包(Closures)

* 闭包 是自包含的函数代码块,可以在代码中被传递和使用。swift中的闭包和Objective-C中的代码块(block)以及其他一些编程语言中的匿名函数类型。 闭包可以捕获和存储其所在上下文中任意常量和变量的引用。这所谓的闭合并包裹这些常量和变量,即是 闭包 *。Swift中会自动处理在捕获过程中涉及到的所有内存操作。 函数分全局和嵌套函数,而函数其实是特殊的闭包,闭包采取如下三种形式之一: ...

快把钟哥带走 120

5.Swift 中的闭包

闭包定义 闭包(Closure)是自包含的函数代码块,可以在代码中被传递和使用。swift 中的闭包和 c 或 oc 中的 block 以及其他的编程语言的匿名函数类似。 在 swift 中闭包的范围比较广泛,不只是 oc 中 block 这种的,还包含像上节中讲到的全局函数和嵌套函数,全局函数是一种有名字但不会捕获任何只的闭包。嵌套函数是一种有名字可以捕获其封闭函数块中的值。 一般闭包...

Yan 2875

Swift 学习笔记 (闭包)

闭包是可以在你的代码中被传递和饮用的功能性独立模块。Swift中的闭包和C以及Objective-C中的Block很像,和其他语言中的匿名函数也很像。 闭包能捕获和存储定义在其上下文中的任何常量和变量的饮用,这也就是所谓的闭合并包裹那些常量和变量,因此称为闭包,Swift能够为你处理所有关于捕获内存管理的操作。 在上一篇函数的介绍中 全局和内嵌函数 实际上就是特殊的闭包,闭包符合如下...

ddiv24492的博客 225

Swift 闭包(笔记)

/***************** 闭包 Closures ****************/ /* *  闭包表达式 Closure Expressions *  尾随闭包 Trailing Closures *  值捕获 Capturing Values *  闭包是引用类型 Closures Are Reference Types * 

蒋昉霖的博客 622

Swift 闭包(block)详解

1、闭包 Swift对闭包进行了简化: 利用上下文推断参数和返回值类型 隐式返回单表达式闭包,即单表达式闭包可以省略return关键字 参数名称缩写 尾随(Trailing)闭包语法 先来看一个排序的例子,数组的降序排列 let usernames = ["Wangwu", "Lisi", "Xiaoming", "Zhangsan"] func backWards(s1: Stri...

qq_32117417的博客 8388

Swift之常见闭包与defer关键字的使用分析和闭包中的循环引用

一、什么是闭包? 在 Swift 中,可以通过 func 定义一个函数,也可以通过闭包表达式定义一个函数,闭包是一个捕获了上下文的常量或者是变量的函数。闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。 Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的 匿名函数比较相似,全局函数和嵌套函数其实就是特殊的闭包。 闭包的形式有: 全局函数 嵌套函数 闭包表达式 有名字但不能捕获任何值 有名字,也能捕获

╰つ栺尖篴夢ゞ 3万+

闭包、自动闭包、逃逸闭包

闭包是自包含的功能块,可以在代码中被传递和使用,它能够捕获和存储其所在上下文中的任何常量和变量的引用。在 Swift 中,闭包类似于其他语言中的匿名函数(lambda)或块(blocks),但提供了更灵活和强大的功能。

Made In SQL 1418
上一篇: Swift-不透明类型,和协议类型的区别
下一篇: Swift-自动引用计数,工作机制、强引用、弱引用
dev.xue
博客等级 码龄7年 1粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值