Swift开发——简单函数实例

简介: 函数是编程的基础,用于封装特定功能的代码。它们有关键词func、函数名、参数列表(可为空)和返回类型。多返回值可通过元组、数组、inout参数或可选类型实现。例如,返回元组 `(value1, value2)`,数组 `[value1, value2]` 或使用可选数组 `[[Double]]?`。函数可以作为其他函数的参数,类似闭包或Lambda表达式。在Swift中,示例展示了通过元组、带索引的元组、数组和可选类型返回多个值的函数。还演示了如何使用inout参数交换变量值。

640.jpg


函数是模块化编程的基本单位,将一组完成特定功能的代码“独立”地组成一个执行单位,称为函数。函数的基本结构如下所示:

image.png


其中,func为定义函数的关键字;“函数名”是调用函数的入口;每个函数可以有多个参数,即可以有多个“参数标签 参数名称:参数类型”,一般地,各个参数的标签不同,参数名称不能相同;当函数没有参数时,“()”必须保留;“函数返回类型”为函数返回值的类型,如果一个函数没有返回值,则省略“->函数返回类型”,此时返回空类型,即Void。函数本身也有类型,由其“(参数类型)->函数返回类型”表示。

一个函数可以作为另一个函数的参数,此时的函数可以写成无函数名的“闭包”形式。所谓闭包,是指由“{ }”包围的一组完成特定功能的代码。函数可视为带有函数名的特殊形式的闭包,而常用的闭包没有“函数名”,参数和返回类型均位于“{ }”内部,闭包类似于C++语言的Lambda函数。
#01、多返回值函数



从函数中返回多个值的方法有如下四种。

(1) 将元组作为函数的返回值,其典型语法如下:

image.png


上述函数语法中,返回值为一个包含两个元素的元组,这里元组的元素名可以省略。

(2) 将数组作为函数的返回值,其典型语法如下:

image.png


上述函数语法中,返回值为一个数组。

(3) 借助inout参数从函数中返回值,其典型语法如下:

image.png


上述函数语法中,虽然只有一个返回值,但是使用了inout参数,即定义的参数在“参数类型”前添加了inout关键字,表示该参数将直接使用传递给该参数的实参变量,在函数体内部对于inout型参数的修改,都将直接对传递给该参数的实参变量进行修改,从而可以通过inout参数实现从函数中返回值。注意,在调用带有inout参数的函数时,inout参数前需要添加“&”符号。

(4) 返回值为可选类型的函数,其典型语法如下:

image.png


上述函数在“返回值类型”后添加了一个“?”号,除了可以返回“返回值类型”指定的值外,还可以返回空值nil。

现在创建工程MyCh0001,包含程序文件main.swift和myfunc.swift,如程序段1和程序段1所示,下面借助工程MyCh0001介绍上述多返回值函数的用法。

程序段1程序文件myfunc.swift
image.png
image.png
image.png
程序段2程序文件main.swift
image.png
image.png
工程MyCh0001的执行结果如图1所示。

image.png


■ 图1 工程MyCh0403的执行结果

下面结合图1介绍工程MyCh0403的程序文件代码。

程序段1所示的程序文件myfunc.swift包含了5个函数,依次如下。

(1) 返回包含三个元素的元组的函数,如程序段1的第3~21行所示,这里将该函数代码再次罗列如下:
image.png
第3行定义了函数calc,具有一个可变个数参数,参数标签为list,参数名为val,返回值为包含三个Double型元素的元组类型。该函数借助元组可以返回三个Double型值。

第5行定义双精度浮点型变量m1、m2、m3和s,其中,m1用于保存数组的最小值,m2用于保存数组的最大值,m3用于保存数组的平均值,s用于保存数组所有元素的和。第6行将m1初始化为val[0],即数组val的首元素;将m2也初始化为val[0];将m3初始化为0;将s初始化为0。

第7~18行为一个for-in结构,计算数组val的全部元素和s、最小元素值m1和最大元素值m2。第19行计算数组val的平均值m3。第20行返回元组“(m1, m2, m3)”。

该函数的调用位于程序段4-7的第3行“let t1=calc(list:1,2,3,4,5,6,7,8,9,10)”,返回的t1为元组(1.0, 10.0, 5.5),即借助元组实现了多返回值。

(2) 返回值为带索引的元组类型的函数,如程序段4-6的第22~27行所示的minmax函数,将函数的代码再次罗列如下:
image.png
第22行定义了函数minmax,具有两个双精度浮点型的参数,返回值的类型为二元元组,这里为元组的每个元素指定了索引名称。第24行定义常量v1,将val1和val2的较小者赋给v1;第25行定义常量v2,将val1和val2的较大者赋给v2。第26行返回元组形式的v1和v2,即返回“(v1, v2)”。

该函数的调用位于程序段4-7的第5行“let t2=minmax(first:13.2, second:7.9)”,调用minmax得到一个元组t2,为(7.9, 13.2)。由于在上述定义函数minmax时为作为函数的返回值的元组的各个元素指定了索引名称,这里可以使用索引名称访问元组的元素,如程序段4-7的第6行“print("min=\(t2.min), max=\(t2.max)")”所示,使用t2.min访问元素t2.0,使用t2.max访问元素t2.1。

(3) 返回值类型为数组类型的函数,如程序段4-6的第28~36行的函数minmax,该函数的代码再次罗列如下:
image.png
第28行定义了函数minmax,具有一个数组类型的参数,参数标签为array,参数名为val,返回值类型为双精度浮点型的数组类型。第30行定义常量v1,赋值为val的最小值;第31行定义常量v2,赋值为val的最大值;第32行定义数组变量r,赋为空数组。第33行将v1添加到数组r中;第34行将v2添加到数组r中。第35行返回数组r。

上述函数的调用位于程序段4-7的第7行“let t3=minmax(array:[3.6,8.2,6.5,10.2,4.1,7.3])”,返回结果赋给t3,此时t3为包含两个元素的一维数组,即[3.6, 10.2]。

上述函数minmax具有一个缺点,没有考虑参数val为空数组的情况。在第30行和第31行中,v1和v2都有可能为空值nil,因此函数minmax的返回值有可能为空值nil。下面的函数修正了这点不足。

(4) 返回值为可选类型的函数,如程序段4-6中第37~44行所示的函数minmaxex,该函数的代码再次罗列如下:
image.png
第37行定义了函数minmaxex,返回值为“[Double]?”,表示这是一个可选类型,可以返回空值nil或双精度浮点型的数组。第39~42行为一个if结构,如果参数val为空数组,则第41行返回空值nil;否则,第43行返回函数minmax的返回值。

调用上述函数minmaxex的语句位于程序段4-7的第9~12行,该函数的代码再次罗列如下:
image.png
这里第9~12行为一个if结构,第9行使用了“iflet”形式的“可选绑定”方法,如果调用minmaxex返回nil,则第9行为假;否则,将minmaxex的返回值赋给t4。第11行输出结果“min=3.6, max=10.2”。

(5) 使用inout类型的参数的函数,如程序段4-6的第45~48行所示的函数swap,该函数的代码再次罗列如下:
image.png
第45行定义了函数swap,具有两个inout类型的参数,这类参数可使得传递给这类参数的实参变量进入函数内部参与运算,修改结果被保留在实参变量中。该函数只有第47行一条语句,即实现v1和v2交换数值。

函数swap的调用位于程序段4-7的第15行“swap(&v1,&v2)”,使用“&”放在实参变量的前面,其中,v1和v2为整型变量,初始值分别为5和9(见程序段4-7的第13行),执行“swap(&v1,&v2)”,v1和v2的值将依次为9和5,相当于借助inout参数返回了两个值。

目录
相关文章
|
3月前
|
Unix 调度 Swift
苹果iOS新手开发之Swift 中获取时间戳有哪些方式?
在Swift中获取时间戳有四种常见方式:1) 使用`Date`对象获取秒级或毫秒级时间戳;2) 通过`CFAbsoluteTimeGetCurrent`获取Core Foundation的秒数,需转换为Unix时间戳;3) 使用`DispatchTime.now()`获取纳秒级精度的调度时间点;4) `ProcessInfo`提供设备启动后的秒数,不表示绝对时间。不同方法适用于不同的精度和场景需求。
68 3
|
11天前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
28 4
|
27天前
|
安全 编译器 Swift
探索iOS开发之旅:Swift编程语言的魅力与挑战
【9月更文挑战第5天】在iOS应用开发的广阔天地中,Swift作为苹果官方推荐的编程语言,以其简洁、高效和安全的特点,成为了开发者的新宠。本文将带领你领略Swift语言的独特魅力,同时探讨在实际开发过程中可能遇到的挑战,以及如何克服这些挑战,成为一名优秀的iOS开发者。
|
27天前
|
设计模式 前端开发 Swift
探索iOS开发:Swift与Objective-C的较量
在这篇文章中,我们将深入探讨iOS开发的两大编程语言——Swift与Objective-C。我们将分析这两种语言的特性、优势和局限性,并讨论它们在现代iOS开发中的应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和建议。
39 3
|
2月前
|
移动开发 安全 Swift
探索iOS开发:从零开始的Swift之旅
【8月更文挑战第31天】本文将带你开启一段Swift编程语言的奇幻旅程,通过简单易懂的方式介绍Swift的基本概念和编程实践。我们将一起构建一个简单的iOS应用,体验从代码到界面的转变。无论你是编程新手还是希望扩展技能的开发者,这篇文章都会为你提供宝贵的知识和启发。
|
2月前
|
API Swift C语言
探索iOS开发:Swift中的异步编程与GCD应用
【8月更文挑战第4天】在iOS开发的海洋中,掌握Swift语言的航向是至关重要的。本文将引领你深入理解Swift中的异步编程概念,并借助Grand Central Dispatch(GCD)这一强大的工具,来简化并发编程的复杂性。我们将通过实际代码示例,展现如何在iOS应用中高效地管理后台任务和提升用户界面的响应性。
55 3
|
3月前
|
Swift iOS开发 Kotlin
苹果iOS新手开发之Swift中实现类似Kotlin的作用域函数
Swift可通过扩展实现类似Kotlin作用域函数效果。如自定义`let`, `run`, `with`, `apply`, `also`,增强代码可读性和简洁性。虽无直接内置支持,但利用Swift特性可达成相似功能。
50 7
|
3月前
|
调度 Swift Android开发
苹果iOS新手开发之Swift中的并发任务和消息机制
Swift的消息机制类似Android的Handler,实现任务调度有三种方式: 1. **Grand Central Dispatch (GCD)**:使用`DispatchQueue`在主线程或后台线程执行任务。 2. **OperationQueue**:提供高级接口管理`Operation`对象。 3. **RunLoop**:处理事件如输入源、计时器,类似Android的`Looper`和`Handler`。 **示例**: - GCD:在不同线程执行代码块。 - OperationQueue:创建操作并执行。 - RunLoop:用Timer添加到RunLoop中。
82 2
|
3月前
|
安全 编译器 Swift
苹果重磅发布Swift 6:在 Swift 6 中如何实现并发开发?相比Swift 5.5 有哪些重磅升级?
Swift 6 强化了并发编程,引入结构化并发、任务、执行器、隔离、同步原语、类型化错误处理和取消超时功能。对比Swift 5.5,它默认启用全面并发检查,改进错误处理,增加了隔离区域、类型化抛出、包迭代等新特性,优化了性能并更新了库。
57 2
|
5月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
302 2
下一篇
无影云桌面