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参数返回了两个值。

目录
相关文章
|
1天前
|
机器学习/深度学习 TensorFlow Swift
Swift语言适合多个领域的开发
Swift语言适合多个领域的开发
18 9
|
1天前
|
安全 编译器 Swift
Swift开发
Swift开发
16 9
|
4天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
19 9
|
11天前
|
安全 编译器 Swift
Swift 函数
10月更文挑战第27天
12 1
|
17天前
|
安全 API Swift
探索iOS开发中的Swift语言之美
【10月更文挑战第23天】在数字时代的浪潮中,iOS开发如同一艘航船,而Swift语言则是推动这艘船前进的风帆。本文将带你领略Swift的独特魅力,从语法到设计哲学,再到实际应用案例,我们将一步步深入这个现代编程语言的世界。你将发现,Swift不仅仅是一种编程语言,它是苹果生态系统中的一个创新工具,它让iOS开发变得更加高效、安全和有趣。让我们一起启航,探索Swift的奥秘,感受编程的乐趣。
|
1月前
|
安全 Swift iOS开发
探索iOS开发中的Swift语言之美
在数字时代的浪潮中,移动应用已成为日常生活的延伸。本文将深入探讨iOS平台上的Swift编程语言,揭示其背后的设计哲学、语法特性以及如何利用Swift进行高效开发。我们将通过实际代码示例,展示Swift语言的强大功能和优雅简洁的编程风格,引导读者理解并运用Swift解决实际问题。
|
2月前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
44 4
|
2月前
|
安全 编译器 Swift
探索iOS开发之旅:Swift编程语言的魅力与挑战
【9月更文挑战第5天】在iOS应用开发的广阔天地中,Swift作为苹果官方推荐的编程语言,以其简洁、高效和安全的特点,成为了开发者的新宠。本文将带领你领略Swift语言的独特魅力,同时探讨在实际开发过程中可能遇到的挑战,以及如何克服这些挑战,成为一名优秀的iOS开发者。
|
2月前
|
设计模式 前端开发 Swift
探索iOS开发:Swift与Objective-C的较量
在这篇文章中,我们将深入探讨iOS开发的两大编程语言——Swift与Objective-C。我们将分析这两种语言的特性、优势和局限性,并讨论它们在现代iOS开发中的应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和建议。
57 3
|
3月前
|
移动开发 安全 Swift
探索iOS开发:从零开始的Swift之旅
【8月更文挑战第31天】本文将带你开启一段Swift编程语言的奇幻旅程,通过简单易懂的方式介绍Swift的基本概念和编程实践。我们将一起构建一个简单的iOS应用,体验从代码到界面的转变。无论你是编程新手还是希望扩展技能的开发者,这篇文章都会为你提供宝贵的知识和启发。