首页 > 其他分享 >Swift开发基础06-闭包

Swift开发基础06-闭包

时间:2024-07-16 10:23:50浏览次数:14  
标签:闭包 06 示例 Int let print return 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闭包的基础和一些高级场景。

标签:闭包,06,示例,Int,let,print,return,Swift
From: https://www.cnblogs.com/chglog/p/18051447

相关文章

  • Swift开发基础07-内存布局
    了解Swift的内存布局和底层原理对于编写高性能和内存高效的应用非常重要。接下来,我将更详细地介绍Swift的内存管理机制和一些底层实现细节,包括内存布局、ARC(自动引用计数)、引用类型和值类型的区别,及其在底层的实现。内存布局(MemoryLayout)栈(Stack)栈内存用于存储函数调用帧(Call......
  • 题解:P10724 [GESP202406 七级] 区间乘积
    思路看到\(a_i\)很小,不难想到状压一类的东西。考虑把每个数的质因数当做二进制位,这个二进制位的\(1/0\)代表含有这个质因数的奇偶,再做一个异或前缀和,显然完全平方数的质因子个数一定为偶数,根据异或的性质,两个相同的数异或才为\(0\)所以只需要找到异或前缀和中相同的数的个......
  • P7706 「Wdsr-2.7」文文的摄影布置
    题意给定长度为\(n\)的数组\(a\)和\(b\),支持单点修改,\(q\)次区间查询\(\max_{l\lei<k\ler}\{a_i+a_k-\min_{i<j<k}b_j\}\)。\(n,q\le5\times10^5,1\lea_i,b_i\le10^8\qquad\text{2s,256MB}\)题解考虑使用线段树维护信息。记\(\psi(p)\)表示线段树上节点\(p......
  • P10720 [GESP202406 五级] 小杨的幸运数字 题解
    题意如果一个数的质因子中只有两个不同的数则输出\(1\),否则输出\(0\)。思路从第一个质因子遍历到\(sum\)的话很明显是\(O(nt)\)最大是\(n^{10}\)很明显会炸掉。所以遍历到\(sum\)是不行的,考虑正整数\(n\)最大的质因数是\(\sqrt{n}\)所以遍历到\(\sqrt{n}\)即......
  • 第 406 场周赛
    100352.交换后字典序最小的字符串枚举交换的位置classSolution{public:stringgetSmallestString(strings){stringres=s;for(inti=1;i<s.size();i++){if(((s[i]-'0')%2)==((s[i-1]-'0')%2)){......
  • 设计模式:使用闭包实现数据集加载过程的依赖倒转
    重点数据集和数据集使用到的参数可以保持不同,将这些不同放到配置文件中进行处理而不是修改获取数据集的加载代码,优点是:减少修改代码的出错统一数据加载的接口格式设计模式:使用闭包实现数据集加载过程的依赖倒转重点前言一、什么是装饰器1、装饰器的定义2、装饰器的使......
  • ORA-01092 ORA-00604 ORA-08103故障处理---惜分飞
    联系:手机/微信(+8617813235971)QQ(107644445)标题:ORA-01092ORA-00604ORA-08103故障处理作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]数据库启动报SQL>alterdatabaseopen;alterdatabaseopen*第1行出现错误:O......
  • 《昇思25天学习打卡营第06天|qingyun201003》
    日期心得什么是函数式自动微分,在日常的模型训练中,涉及到复杂的数学公式如何转换为机械语言,通过本次的学习,使我了解到了如何去做梯度计算,通过梯度计算,设计损失函数,有一步步优化代码。昇思MindSpore基础入门学习函数式自动微分(AI代码解析)函数式自动微分神经网络的......
  • SP4063 MPIGS - Sell Pigs / P4638 [SHOI2011] 银行家题解
    考虑使用网络流。建立源点\(S\)和汇点\(T\)。每个人作为一个点,将它们与汇点\(T\)连接,权值为需要的猪的数量。然后对于每个人,如果和之前的某个人开了相同的猪圈,那么就将之前的那个人的点与这个人的点连接。如果猪圈还没有被开过,就从源点\(S\)连接这个点,权值为猪圈猪的初......
  • leetcode周赛 - 406
    100352.交换后字典序最小的字符串给你一个仅由数字组成的字符串 s,在最多交换一次 相邻 且具有相同 奇偶性 的数字后,返回可以得到的字典序最小的字符串。如果两个数字都是奇数或都是偶数,则它们具有相同的奇偶性。例如,5和9、2和4奇偶性相同,而6和9奇偶性不......