当前位置:首页 > 科技  > 软件

Swift 闭包的多种形式:包括闭包表达式、尾随闭包、逃逸闭包等

来源: 责编: 时间:2024-01-22 17:25:15 317观看
导读本文我们将介绍 Swift 中闭包表达式、尾随闭包和逃逸闭包等相关的内容。如果你尚未安装 Xcode 和配置 Swift 开发环境,请您先阅读这篇文章。接下来,我们启动 Xcode,然后选择 "File" > "New" > "Playground"。创建一个新

c0O28资讯网——每日最新资讯28at.com

本文我们将介绍 Swift 中闭包表达式、尾随闭包和逃逸闭包等相关的内容。如果你尚未安装 Xcode 和配置 Swift 开发环境,请您先阅读这篇文章。c0O28资讯网——每日最新资讯28at.com

接下来,我们启动 Xcode,然后选择 "File" > "New" > "Playground"。创建一个新的 Playground 并命名为 "Closures"。c0O28资讯网——每日最新资讯28at.com

在 Swift 中,闭包是自包含的功能块,可以捕获和存储上下文中任意常量和变量的引用。Swift 闭包有多种形式,包括闭包表达式、尾随闭包、逃逸闭包等。c0O28资讯网——每日最新资讯28at.com

闭包表达式

闭包表达式语法

闭包表达式是一种轻量级语法,用于表示内联闭包。它的语法如下:c0O28资讯网——每日最新资讯28at.com

{ (parameters) -> returnType in    // Closure body}

相关说明如下:c0O28资讯网——每日最新资讯28at.com

  • parameters:定义了闭包的参数列表。
  • returnType:定义了闭包的返回类型。
  • in:用于分隔参数列表和闭包体。

创建闭包

了解了闭包表达式的语法之后,我们来创建一个闭包。c0O28资讯网——每日最新资讯28at.com

Swift Codec0O28资讯网——每日最新资讯28at.com

// 定义一个闭包,它接受两个参数并返回它们的总和let addClosure: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in    return a + b}// 调用 addClosure 闭包let sum = addClosure(2, 3)print("Sum: /(sum)")// Output: Sum: 5

在以上例子中,addClosure 是一个接受两个整数参数并返回它们和的闭包。在闭包表达式中,Swift 可以根据上下文推断参数类型和返回类型,因此通常可以省略它们:c0O28资讯网——每日最新资讯28at.com

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

如果闭包体只包含一条语句,可以省略 return 关键字:c0O28资讯网——每日最新资讯28at.com

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

在 Swift 的闭包表达式中,$0$1 等是用来表示闭包参数的缩写形式。这种缩写形式允许在闭包表达式中直接引用参数,而不需要显式地命名。所以,以上的代码,还可以继续简化:c0O28资讯网——每日最新资讯28at.com

let addClosure: (Int, Int) -> Int = { $0 + $1 }

下面,我们来看一下等价的 TypeScript 代码。c0O28资讯网——每日最新资讯28at.com

TypeScript Codec0O28资讯网——每日最新资讯28at.com

const addClosure: (a: number, b: number) => number = (a, b) => {    return a + b;};const sum: number = addClosure(2, 3);console.log(`Sum: ${sum}`); // Output: "Sum: 5"

闭包作为函数参数

闭包可以作为函数的参数,使得函数更加灵活。c0O28资讯网——每日最新资讯28at.com

Swift Codec0O28资讯网——每日最新资讯28at.com

func performOperation(_ operation: (Int, Int) -> Int, a: Int, b: Int) {    let result = operation(a, b)    print("Result: /(result)")}performOperation({ (a: Int, b: Int) -> Int in    return a + b}, a: 2, b: 3)// Output:Result: 5

TypeScript Codec0O28资讯网——每日最新资讯28at.com

function performOperation(operation: (a: number, b: number) => number, a: number, b: number): void {    const result: number = operation(a, b);    console.log(`Result: ${result}`);}performOperation((a: number, b: number) => {    return a + b;}, 2, 3);// Output: "Result: 5"

闭包作为排序函数的参数

Swift Codec0O28资讯网——每日最新资讯28at.com

let numbers = [4, 2, 8, 5, 1]// 使用尾随闭包let sortedNumbers = numbers.sorted { $0 < $1 }print(sortedNumbers)// Output: [1, 2, 4, 5, 8]

TypeScript Codec0O28资讯网——每日最新资讯28at.com

const numbers: number[] = [4, 2, 8, 5, 1];const sortedNumbers: number[] = numbers.sort((a, b) => a - b);console.log(sortedNumbers);// Output: [1, 2, 4, 5, 8]

在闭包中捕获值

在 Swift 中,闭包可以捕获并存储它们定义时所在上下文中的常量和变量。即使定义这些常量和变量的原始上下文已经不存在,闭包仍然可以引用和修改这些值。下面我们来举一个闭包捕获外部函数的局部变量的示例:c0O28资讯网——每日最新资讯28at.com

Swift Codec0O28资讯网——每日最新资讯28at.com

func makeIncrementer(forIncrement amount: Int) -> () -> Int {    var runningTotal = 0    let incrementer: () -> Int = {        runningTotal += amount        return runningTotal    }    return incrementer}let incrementByTen = makeIncrementer(forIncrement: 10)print(incrementByTen()) // Output: 10print(incrementByTen()) // Output: 20

在以上代码中,incrementByTen 是一个闭包,它捕获了 makeIncrementer 函数内的 runningTotal  amount 变量。即使 makeIncrementer 函数的执行已经完成,这些捕获的变量仍然存在于闭包内。c0O28资讯网——每日最新资讯28at.com

在 JavaScript 中,函数可以访问定义它们的函数的作用域中的变量。这个特性被称为词法作用域或静态作用域。虽然 JavaScript 没有专门的闭包语法,但函数本身就表现出闭包的行为。c0O28资讯网——每日最新资讯28at.com

TypeScript Codec0O28资讯网——每日最新资讯28at.com

function makeIncrementer(amount: number): () => number {    let runningTotal = 0;    return function(): number {        runningTotal += amount;        return runningTotal;    }}const incrementByTen = makeIncrementer(10);console.log(incrementByTen()); // Output: 10console.log(incrementByTen()); // Output: 20

尾随闭包

尾随闭包(Trailing Closures)在 Swift 中是一个非常有用的特性,尤其是当闭包作为函数的最后一个参数时。尾随闭包语法使得在函数调用时将闭包写在函数括号之外,使得代码更加清晰。c0O28资讯网——每日最新资讯28at.com

let result = someFunction(arg1, arg2) { parameter in    // 闭包体}

Swift Codec0O28资讯网——每日最新资讯28at.com

func applyOperation(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) -> Int {    return operation(a, b)}// Calling a function using a trailing closurelet result = applyOperation(2, 3) { $0 + $1 }print("Result: /(result)") // Output: Result: 5

在以上示例中,applyOperation 函数接受两个整数和一个闭包作为参数。使用尾随闭包语法,我们可以将闭包写在函数调用的括号之外,使得代码更加简洁。在 TypeScript 中,并没有直接的尾随闭包语法,但可以通过将函数的最后一个参数定义为函数类型来达到类似的效果。c0O28资讯网——每日最新资讯28at.com

TypeScript Codec0O28资讯网——每日最新资讯28at.com

function applyOperation(a: number, b: number, operation: (a: number, b: number) => number): number {    return operation(a, b);}const result: number = applyOperation(2, 3, (a, b) => a + b);console.log(`Result: ${result}`);// Output: "Result: 5"

逃逸闭包

逃逸闭包(Escaping Closures)是一个重要的概念,特别是在处理异步操作和回调时。逃逸闭包与非逃逸闭包的主要区别在于它们的生命周期:逃逸闭包可以在函数返回之后被调用,而非逃逸闭包则必须在函数返回之前被调用。逃逸闭包是在函数执行完毕后才被调用的闭包。在参数列表前加上 @escaping 关键字表示该闭包逃逸。c0O28资讯网——每日最新资讯28at.com

Swift Codec0O28资讯网——每日最新资讯28at.com

import Foundationfunc loadData(completionHandler: @escaping (String) -> Void) {    // 模拟异步操作    DispatchQueue.global().async {        let data = "Hello, Escaping closures!"        DispatchQueue.main.async {            completionHandler(data)        }    }}loadData { data in    print("Received: /(data)")}// Output: Received: Hello, Escaping closures!

在以上示例中,completionHandler 是一个逃逸闭包,因为它在函数返回之后的某个时间点被调用。在 TypeScript 中,虽然并没有专门的逃逸闭包的语法,但我们可以通过传递函数作为参数,并在异步操作完成后调用该函数来模拟逃逸闭包的效果。c0O28资讯网——每日最新资讯28at.com

TypeScript Codec0O28资讯网——每日最新资讯28at.com

function loadData(): Promise<string> {    return new Promise((resolve) => {        // 模拟异步操作        setTimeout(() => {            const data = "Hello, Closures!";            resolve(data);        }, 1000);    });}loadData().then(data => {    console.log(`Received: ${data}`);});// Output: "Received: Hello, Closures!"

Swift 的逃逸闭包和 TypeScript 的异步操作处理都是处理延时执行、异步执行的强大工具。它们都允许函数在完成某些操作后再执行一些代码,这在处理网络请求、数据库操作等异步任务时非常有用。c0O28资讯网——每日最新资讯28at.com

本文我们介绍了 Swift 中闭包表达式、尾随闭包和逃逸闭包等相关的内容。通过与 TypeScript 语法的对比,希望能帮助您更好地理解 Swift 的相关特性。c0O28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-66199-0.htmlSwift 闭包的多种形式:包括闭包表达式、尾随闭包、逃逸闭包等

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 聊聊我所理解的平台工程

下一篇: 走过近30年:Java外表成熟,内心依旧少年

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 鸿蒙OS 4.0公测机型公布:甚至连nova6都支持

    华为全新的HarmonyOS 4.0操作系统将于今天下午正式登场,官方在发布会之前也已经正式给出了可升级的机型产品,这意味着这些机型会率先支持升级享用。这次的HarmonyOS 4.0支持
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 苹果、三星、惠普等暂停向印度出口笔记本和平板电脑

    集微网消息,据彭博社报道,在8月3日印度突然禁止在没有许可证的情况下向印度进口电脑/平板及显示器等产品后,苹果、三星电子和惠普等大公司暂停向印度
  • 3699元!iQOO Neo8 Pro顶配版今日首销:1TB UFS 4.0同价位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更是首发搭载了联发科天玑9200+旗舰
  • 回归OPPO两年,一加赢了销量,输了品牌

    成为OPPO旗下主打性能的先锋品牌后,一加屡创佳绩。今年618期间,一加手机全渠道销量同比增长362%,凭借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
Top