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

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

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

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

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

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

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

闭包表达式

闭包表达式语法

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

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

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

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

创建闭包

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

Swift CodeF8Z28资讯网——每日最新资讯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 可以根据上下文推断参数类型和返回类型,因此通常可以省略它们:F8Z28资讯网——每日最新资讯28at.com

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

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

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

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

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

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

TypeScript CodeF8Z28资讯网——每日最新资讯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"

闭包作为函数参数

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

Swift CodeF8Z28资讯网——每日最新资讯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 CodeF8Z28资讯网——每日最新资讯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 CodeF8Z28资讯网——每日最新资讯28at.com

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

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

Swift CodeF8Z28资讯网——每日最新资讯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 函数的执行已经完成,这些捕获的变量仍然存在于闭包内。F8Z28资讯网——每日最新资讯28at.com

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

TypeScript CodeF8Z28资讯网——每日最新资讯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 中是一个非常有用的特性,尤其是当闭包作为函数的最后一个参数时。尾随闭包语法使得在函数调用时将闭包写在函数括号之外,使得代码更加清晰。F8Z28资讯网——每日最新资讯28at.com

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

Swift CodeF8Z28资讯网——每日最新资讯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 中,并没有直接的尾随闭包语法,但可以通过将函数的最后一个参数定义为函数类型来达到类似的效果。F8Z28资讯网——每日最新资讯28at.com

TypeScript CodeF8Z28资讯网——每日最新资讯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 关键字表示该闭包逃逸。F8Z28资讯网——每日最新资讯28at.com

Swift CodeF8Z28资讯网——每日最新资讯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 中,虽然并没有专门的逃逸闭包的语法,但我们可以通过传递函数作为参数,并在异步操作完成后调用该函数来模拟逃逸闭包的效果。F8Z28资讯网——每日最新资讯28at.com

TypeScript CodeF8Z28资讯网——每日最新资讯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 的异步操作处理都是处理延时执行、异步执行的强大工具。它们都允许函数在完成某些操作后再执行一些代码,这在处理网络请求、数据库操作等异步任务时非常有用。F8Z28资讯网——每日最新资讯28at.com

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

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

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

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

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

标签:
  • 热门焦点
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 三星Galaxy Z Fold/Flip 5国行售价曝光 :最低7499元/12999元起

    据官方此前宣布,三星将于7月26日也就是明天在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • OPPO Reno10 Pro英雄联盟定制礼盒公布:萨勒芬妮同款配色梦幻十足

    5月24日,OPPO推出了全新的OPPO Reno 10系列,包含OPPO Reno10、OPPO Reno10 Pro和OPPO Reno10 Pro+三款新机,全系标配了超光影长焦镜头,是迄今为止拍照
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
Top