当前位置: 首页 > news >正文

IOS Swift 从入门到精通:闭包 第一部分

文章目录

  • 创建基本闭包
  • 在闭包中接受参数
  • 从闭包返回值
  • 闭包作为参数
  • 尾随闭包语法

创建基本闭包

Swift 允许我们像使用字符串和整数等其他类型一样使用函数。这意味着您可以创建一个函数并将其分配给一个变量,使用该变量调用该函数,甚至可以将该函数作为参数传递给其他函数。

以这种方式使用的函数称为闭包,尽管它们的工作原理与函数类似,但写法略有不同。

让我们从一个打印消息的简单示例开始:

let driving = {print("I'm driving in my car")
}

这实际上创建了一个没有名称的函数,并将该函数分配给driving。现在你可以driving()像调用常规函数一样调用它,如下所示:

driving()

在闭包中接受参数

当你创建闭包时,它们没有名称或空间来写任何参数。这并不意味着它们不能接受参数,只是它们以不同的方式接受参数:它们列在开括号内。

为了使闭包接受参数,请将它们列在紧接在开括号后的括号内,然后书写in,以便 Swift 知道闭包的主体正在开始。

例如,我们可以创建一个闭包,让它接受地名字符串作为其唯一参数,如下所示:

let driving = { (place: String) inprint("I'm going to \(place) in my car")
}

函数和闭包之间的一个区别是,运行闭包时不使用参数标签。因此,driving()现在要调用闭包,我们可以这样写:

driving("London")

从闭包返回值

闭包也可以返回值,它们的写法与参数类似:将它们写在闭包内部,直接在关键字之前in。

为了演示这一点,我们将使用driving()闭包并使其返回其值,而不是直接打印它。这是原始代码:

let driving = { (place: String) inprint("I'm going to \(place) in my car")
}

我们想要一个返回字符串的闭包而不是直接打印消息,所以我们需要使用-> Stringbefore in,然后return像普通函数一样使用:

let drivingWithReturn = { (place: String) -> String inreturn "I'm going to \(place) in my car"
}

我们现在可以运行该闭包并打印其返回值:

let message = drivingWithReturn("London")
print(message)

闭包作为参数

因为闭包可以像字符串和整数一样使用,所以你可以将它们传递给函数。这种语法一开始可能会让你头疼,所以我们会慢慢讲。

首先,这是我们的基本driving()结论

let driving = {print("I'm driving in my car")
}

如果我们想将闭包传递给一个函数,以便它可以在该函数内运行,我们将指定参数类型为() -> Void。这意味着“不接受任何参数,并返回Void”——Swift 表示“无”。

因此,我们可以编写一个travel()函数,接受不同类型的旅行动作,并在之前和之后打印一条消息:

func travel(action: () -> Void) {print("I'm getting ready to go.")action()print("I arrived!")
}

我们现在可以使用闭包来调用它driving,如下所示:

travel(action: driving)

尾随闭包语法

如果函数的最后一个参数是闭包,Swift 允许你使用一种特殊的语法,称为尾随闭包语法。你不必将闭包作为参数传递,而是直接在函数后面的括号内传递它。

为了演示这一点,下面travel()再次展示我们的函数。它接受一个action闭包,以便可以在两次调用之间运行print():

func travel(action: () -> Void) {print("I'm getting ready to go.")action()print("I arrived!")
}

因为它的最后一个参数是一个闭包,所以我们可以travel()使用尾随闭包语法进行调用,如下所示:

travel() {print("I'm driving in my car")
}

事实上,因为没有任何其他参数,我们可以完全消除括号:

travel {print("I'm driving in my car")
}

尾随闭包语法在 Swift 中非常常见,因此值得习惯。

http://www.lryc.cn/news/379367.html

相关文章:

  • 解两道四年级奥数题(等差数列)玩玩
  • 深入理解Python中的并发与异步的结合使用
  • 如何将 ChatGPT 集成到你的应用中
  • 在 Swift 中,UILabel添加点击事件的方法
  • indexedDB---掌握浏览器内建数据库的基本用法
  • 【css】如何修改input选中历史选项后,自动填充的蓝色背景色
  • 红队内网攻防渗透:内网渗透之内网对抗:网络通讯篇防火墙组策略入站和出站规则单层双层C2正反向上线解决方案
  • linux 查看进程启动方式
  • 基于Java实训中心管理系统设计和实现(源码+LW+调试文档+讲解等)
  • 第2章 Android应用的界面编程
  • springboot学习-图灵课堂-最详细学习
  • Total CAD Converter与Total Excel Converter软件分享
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 启动多任务排序(200分) - 三语言AC题解(Python/Java/Cpp)
  • 【会议征稿,JPCS出版】第三届电力系统与能源技术国际学术会议(ICPSET 2024,7月5-7)
  • 【机器学习300问】118、循环神经网络(RNN)的基本结构是怎样的?
  • loveqq-framework 和 thymeleaf 整合遇到的 th:field 的坑,原来只有 spring 下才有效
  • hugging face:大模型时代的github介绍
  • 如何快速绘制logistic回归预测模型的ROC曲线?
  • 实现具有多个实现类的接口并为每个实现类定义一个名字的方法
  • Linux解压缩命令
  • 如何在 Ubuntu 14.04 上使用 Iptables 实现基本防火墙模板
  • jasypt对yml文件进行加密解密
  • vue3-openlayers 使用tianditu,wmts和xyz等source加载天地图切片服务
  • npm、yarn、pnpm 最新国内镜像源设置和常见问题解决
  • Qt Object:智能即时聊天室项目
  • php,python aes加密反解
  • 基于Java学生选课管理系统设计和实现(源码+LW+调试文档+讲解等)
  • 阅读笔记——《Large Language Model guided Protocol Fuzzing》
  • C#委托:事件驱动编程的基石
  • Git的下载安装及可视化工具小乌龟