Swift从0开始学习 函数和闭包 day2
一、函数
1.1函数定义
使用 func 来声明一个函数,使用名字和参数来调用函数。使用 -> 来指定函数返回值的类型。
示例:拼接字符串
//有参数和返回值的函数
func append1(name : String, description : String) -> String {return "\(name) is \(description)"
}//调用
append1(name: "Tony", description: "good")
运行结果:
默认情况下,函数会使用默认的参数名称作为参数标签,如果需要自定义参数标签,示例如下
"youName"和"youHabby"是自定义的标签
//在参数名称前自定义参数标签
func CustomParameterLabels(youName name : String, youHabby habby : String) -> String {return "\(name)'s hobbies is \(habby).(Custom parameter labels)"
}CustomParameterLabels(youName: "Tony", youHabby: "cutting hair")
运行结果:![]()
如果不想使用传输标签,可以使用"_“来实现
//不使用参数标签,可以使用"_"来表示
func NoneParameter(_ name : String, habby : String) -> String {return "\(name)'s hobbies is \(habby).(Parameter-free labels)"
}NoneParameter("Tony", habby: "cutting hair")
运行结果:
如果函数需要返回多个值,可以使用元组来实现。示例
这里返回多个值没有参数标签
func getMultipleValues() -> (Int, String, Bool) {return (42, "Hello", true)
}// 调用示例
let result = getMultipleValues()
运行结果:![]()
如果需要返回的多个值是有标签的,参考如下:
//返回带参数标签的多个值
func getMultipleValues() -> (minScore : Int, maxScore : Int, totalScore : Int) {return (42, 99, 141)
}// 调用示例
let result = getMultipleValues()print(result.0)
print(result.minScore)
运行结果:
1.2函数嵌套,复合使用
函数内可以继续嵌套函数来处理较长或者复杂的实现。示例;
//整数转字符串
func IntToString(score : Int) -> String {//加多十分func toString(score : Int) -> Int{var score = score + 10return score}var newScore = toString(score: score)return "\(newScore)"
}IntToString(score: 90)
运行结果:
函数也可以当做返回值,使用示例如下:
func addScore() -> ((Int) -> Int) {//加多十分func addTenScore(score : Int) -> Int{return score + 10}return addTenScore
}//调用,返回一个函数
var myFunc = addScore()
//调用这个函数
myFunc(80)
函数也可以作为参数传入。如下
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {for item in list {if condition(item) {return true}}return false
}
func lessThanTen(number: Int) -> Bool {return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThanTen)
1.3闭包
闭包(Closure)是一块自包含的代码,可以在代码中被传递和使用。闭包可以捕获和存储其所在上下文中的变量和常量的引用
闭包的基础语法:
// 闭包的基本形式
{ (parameters) -> returnType in// 闭包的实现代码
}
parameters是闭包的输入参数(可以为空)。returnType是闭包的返回值类型(可以省略,Swift 会推断)。in关键字分隔了闭包的参数和实现代码。
简单闭包的实现:
// 一个简单的闭包,接收两个整数,返回它们的和
let add: (Int, Int) -> Int = { (a, b) inreturn a + b
}// 使用闭包
let result = add(3, 5)
print(result) // 输出 8
闭包捕获值
func makeIncrementer(incrementAmount: Int) -> () -> Int {var total = 0let incrementer: () -> Int = {total += incrementAmount // 捕获 incrementAmount 和 totalreturn total}return incrementer
}let incrementByTwo = makeIncrementer(incrementAmount: 2)
print(incrementByTwo()) // 输出 2
print(incrementByTwo()) // 输出 4
在这个例子中,incrementByTwo 捕获了 incrementAmount 和 total,每次调用 incrementByTwo() 时,total 都会增加 2。
闭包作为函数参数
闭包常常用作函数的参数,特别是在处理异步操作、回调等情况时,在网络请求中用的最多。例如:
func fetchData(completion: @escaping (String) -> Void) {// 模拟网络请求DispatchQueue.global().async {// 模拟延迟Thread.sleep(forTimeInterval: 2)DispatchQueue.main.async {completion("数据加载完成")}}
}fetchData { data inprint(data) // 输出 "数据加载完成"
}
使用闭包时管理好对外部对象的引用.
相关文章:
Swift从0开始学习 函数和闭包 day2
一、函数 1.1函数定义 使用 func 来声明一个函数,使用名字和参数来调用函数。使用 -> 来指定函数返回值的类型。 示例:拼接字符串 //有参数和返回值的函数 func append1(name : String, description : String) -> String {return "\(name)…...
内网、公网(外网)划分
内网、公网(外网)划分 声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其…...
【linux】centos7 换阿里云源
相关文章 【linux】CentOS 的软件源(Repository)学习-CSDN博客 查看yum配置文件 yum的配置文件通常位于/etc/yum.repos.d/目录下。你可以使用以下命令查看这些文件: ls /etc/yum.repos.d/ # 或者 ll /etc/yum.repos.d/备份当前的yum配置文…...
用OMS进行 OceanBase 租户间数据迁移的测评
基本概念 OceanBase迁移服务(,简称OMS),可以让用户在同构或异构 RDBMS 与OceanBase 数据库之间进行数据交互,支持数据的在线迁移,以及实时增量同步的复制功能。 OMS 提供了可视化的集中管控平台ÿ…...
【因果分析方法】MATLAB计算Liang-Kleeman信息流
【因果分析方法】MATLAB计算Liang-Kleeman信息流 1 Liang-Kleeman信息流2 MATLAB代码2.1 函数代码2.2 案例参考Liang-Kleeman 信息流(Liang-Kleeman Information Flow)是由 Liang 和 Kleeman 提出的基于信息论的因果分析方法。该方法用于量化变量之间的因果关系,通过计算信息…...
【Java基础知识系列】之Java类的初始化顺序
前言 类的初始化顺序 简单场景 代码示例 public class Person {private String name initName();private String initName() {System.out.println("【父类】初始化实例变量name");return "【父类】史蒂夫";}private int age;private static int staticVa…...
Swift 宏(Macro)入门趣谈(二)
概述 苹果在去年 WWDC 23 中就为 Swift 语言新增了“其利断金”的重要小伙伴 Swift 宏(Swift Macro)。为此,苹果特地用 2 段视频(入门和进阶)颇为隆重的介绍了它。 那么到底 Swift 宏是什么?有什么用&…...
vue elementui el-dropdown-item设置@click无效的解决方案
如图,直接在el-dropdown-item上面设置click,相应的method并没有被触发,查找资料发现需要在它的上级 el-dropdown 处使用 command 方法触发。 【template】 <el-dropdown placement"bottom-end" command"handleCommand&quo…...
如何用re从第1排第2个位置中找到两个数字返回(0,1)
以下是使用 Python 的re模块从第1班第2个位置这样的字符串中提取出数字并返回类似(0, 1)这种形式的示例代码,假设数字都是一位数的情况(如果是多位数可以按照后续介绍稍作调整): import redef extract_numbers(text):numbers re.…...
vue中的keep-alive是什么,有哪些使用场景,使用了什么原理,缓存后如何更新数据
<keep-alive> 是 Vue.js 提供的一个内置组件,用于缓存动态组件,避免频繁的销毁和重建。这在某些场景下可以显著提升性能,特别是在组件频繁切换的情况下。以下是对 keep-alive 的详细讲解,包括它的定义、使用场景、原理分析、…...
LeetCode105.从前序与中序遍历构造二叉树
题目要求 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 提示: 1 < preorder.length < 3000inorder.length preorder.length-3000 < pr…...
LeetCode654.最大二叉树
LeetCode刷题记录 文章目录 📜题目描述💡解题思路⌨C代码 📜题目描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子…...
C# 字段和属性
在 C# 中,字段和属性是定义类和结构体数据的两种方式。 字段用于直接存储数据,而属性提供了对字段的封装和访问控制。 1. 字段(Fields) 定义 字段是类或结构体中用于存储数据的变量。字段可以是任何数据类型,包括基…...
【leetcode】N皇后 回溯法c++
目录 51.N皇后 52.N皇后II 51.N皇后 51. N 皇后 - 力扣(LeetCode) 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间…...
Ubuntu 系统端口查询与管理详细分析
目录 前言1. 查询端口占用情况2. 释放占用的端口3. 修改应用程序的端口 前言 Window的端口被占用,类似的知识点:重装mysql时3306端口被占用解决方法 事情起因是宝塔的CPU负载过大,重启服务进程之后还是爆,后续发现是端口被占用&…...
Unity中使用StartCoroutine协程和Lerp方法,使GameObject缓慢移动
移动方法(传入需要移动的instance和目标位置) public Transform targetPosition; //目标位置 Vector3 target targetPosition.position;private IEnumerator MoveTowardsTarget(GameObject instance, Vector3 target){// 缓慢移动到目标的方法Vector3 …...
C++根据特定字符截取字符串
前言 在 C 中,如果根据特定字符进行字符串的截取,可以使用 std::string 类的成员函数 find() 来查找字符的位置,然后使用 substr() 来截取字符串。以下是一个示例,展示了如何根据指定字符截取字符串。 示例 #include <iostr…...
【How AI Works】读书笔记3 出发吧! AI纵览 第二部分
目录 1.说明 2.第二部分(P9~P10) 机器学习算法总结(监督学习) 3.单词 4.专业术语 1.说明 书全名:How AI Works From Sorcery to Science 作者 Ronald T.Kneusel 2.第二部分(P9~P10) 总结机器学习算法 作者把机器学习的过程比喻成输入-->黑盒-->输出 这里的标签可…...
No Module named pytorchvideo.losses问题解决
问题描述 最近在跑X3D的源码时发现,在conda powershell prompt中安装了pytorchvideo,但是仍然报错:No Module named pytorchvideo.losses 解决方案: 直接去https://gitcode.com/gh_mirrors/py/pytorchvideo/overview?utm_sour…...
Mac终端字体高亮、提示插件
一、安装配置“oh my zsh” 1.1 安装brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 按照步骤安装即可,安装完成查看版本 brew -v 1.2 安装zsh brew install zsh 安装完成后查看版本 zsh --version 1.3 …...
从美颜到卫星图:聊聊傅里叶变换在CV领域那些‘看不见’的应用
从美颜到卫星图:傅里叶变换在CV领域的隐形革命 当你用手机拍摄一张自拍,轻触"美颜"按钮时;当医生通过CT扫描诊断病情时;甚至当气象学家分析卫星云图预测台风路径时——这些看似毫不相关的场景背后,都藏着一个…...
一文说清:穿透式监管体系、穿透式监管平台、穿透式监管模型
最近这段时间,和不少央国企的财务、风控负责人交流,话题总绕不开穿透式监管。大家共识很强:穿透式监管必须做,也不得不做。穿透式监管建设本身,横跨了三个专业壁垒很高的领域:公司治理与风险管理、企业数字…...
FreeRTOS SMP多核调试踩坑记:在TC397上如何确认你的任务真的跑在了对的CPU核心?
TC397多核调试实战:如何验证FreeRTOS任务真的跑在指定核心? 调试多核系统就像在迷宫中寻找出口——即使代码看起来正确,任务也可能悄悄溜到错误的核心上执行。当LED闪烁频率异常、任务响应延迟或系统出现难以解释的锁死时,开发者首…...
JDK 17文本块实战:告别繁琐拼接,拥抱多行字符串新写法
1. 为什么我们需要文本块? 如果你写过Java代码,肯定遇到过这样的场景:需要处理多行字符串,比如HTML模板、SQL语句或者JSON数据。在JDK 17之前,我们只能通过字符串拼接的方式来实现,代码看起来就像是一团乱麻…...
JVM性能调优实战:从GC日志分析到内存泄漏排查的完整工具链
1. 项目概述:从“感觉卡顿”到“数据说话”的JVM调优之路在电商大促、金融交易峰值或者物联网设备海量上报的瞬间,后台服务的响应延迟哪怕增加几十毫秒,都可能直接转化为用户流失或交易失败。作为一线开发者,我们常常会收到“系统…...
告别卡顿与隐私担忧:用Docker Compose在1核1G VPS上部署高性能RustDesk私有服务器
在1核1G VPS上构建高性能RustDesk私有化服务的完整指南 远程协作已成为现代工作流中不可或缺的一环,而数据隐私和连接稳定性则是技术爱好者最关注的核心问题。开源远程桌面解决方案RustDesk以其轻量级架构和自托管能力,为追求完全控制权的用户提供了理想…...
数字视频发送器(SDI编码器)
这是一款数字视频发送器(SDI编码器),功能对标Genum公司的GV7600和Semtech的GS2972。该芯片主要用于将并行数字视频信号(如BT.1120)转换为串行SDI信号,通过75欧姆同轴线缆进行传输。特征:传输速率…...
告别默认视图:5个CloudCompare点云可视化高级技巧(颜色映射、尺寸分级、OpenGL优化)
告别默认视图:5个CloudCompare点云可视化高级技巧(颜色映射、尺寸分级、OpenGL优化) 在三维点云处理领域,可视化效果直接影响数据分析的深度与决策效率。CloudCompare作为开源点云处理利器,其默认视图设置往往难以满足…...
别让电流倒灌毁了你的MCU!手把手教你用肖特基二极管和MOS管搞定电平转换电路
嵌入式系统电平转换电路设计实战:阻断电流倒灌的5种硬件方案 当3.3V单片机需要驱动5V传感器时,或者5V逻辑器件要与1.8V处理器通信时,电平转换电路就成了系统稳定的关键屏障。去年我在工业控制器项目中就曾遇到一个典型问题:当5V外…...
LyricsX终极指南:如何在macOS上免费获得完美歌词同步体验
LyricsX终极指南:如何在macOS上免费获得完美歌词同步体验 【免费下载链接】LyricsX 🎶 Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX 你是否厌倦了在不同音乐播放器间切换时手动搜索歌词?Lyr…...
