IOS Swift 从入门到精通: 函数,参数和异常

文章目录

  • 编写函数
  • 接受参数
  • 返回值
  • 参数标签
  • 省略参数标签
  • 默认参数
  • 可变参数函数
  • 编写抛出函数
  • 运行异常函数
  • 输入输出参数
  • 总结

编写函数

函数让我们可以重复使用代码,这意味着我们可以编写一个函数来做一些有趣的事情,然后从很多地方运行该函数。重复代码通常是一个坏主意,而函数可以帮助我们避免这样做。

首先,我们要编写一个函数来为应用用户打印帮助信息。我们可能在应用中的任何地方都需要它,因此将其作为一个函数是个好主意。

Swift 函数以func关键字开头,然后是函数名称,然后是开括号和闭括号。函数的整个主体(即请求函数时应运行的代码)都放在括号内。

现在让我们编写该printHelp()函数:

func printHelp() {let message = """
Welcome to MyApp!Run this app inside a directory of images and
MyApp will resize them all into thumbnails
"""print(message)
}

printHelp()我们现在可以单独运行它:

printHelp()
运行函数通常称为调用函数。

接受参数

每次运行函数时,如果可以自定义它们,那么函数就会变得更加强大。Swift 允许你将值发送给函数,然后可以在函数内部使用这些值来更改其行为方式。我们已经使用过这种方法了——我们一直在向函数发送字符串和整数print(),如下所示:

print("Hello, world!")

以这种方式发送到函数的值称为参数。

要使你自己的函数接受参数,请为每个参数指定一个名称,然后加上冒号,然后告诉 Swift 它必须是哪种数据类型。所有这些都放在函数名称后的括号内。

例如,我们可以编写一个函数来打印任意数字的平方:

func square(number: Int) {print(number * number)
}

这告诉 Swift 我们期望收到一个Int,它应该被称为number。当你想引用参数时,这个名字既可以在函数内部使用,也可以在运行函数时使用,如下所示:

square(number: 8)

返回值

除了接收数据外,函数还可以返回数据。为此,请在函数的参数列表后写一个破折号和一个右尖括号,然后告诉 Swift 将返回哪种数据。

在函数内部,您可以使用return关键字返回一个值(如果有)。然后,函数会立即退出并返回该值 - 不会运行该函数中的其他代码。

我们可以重写square()函数来返回一个值而不是直接打印它:

func square(number: Int) -> Int {return number * number
}

现在我们可以在函数运行时获取该返回值并将其打印出来:

let result = square(number: 8)
print(result)

如果需要返回多个值,这就是何时使用元组的完美示例。

参数标签

我们的square()函数写法如下:

func square(number: Int) -> Int {return number * number
}

这为其参数命名number,因此我们可以number在函数内部使用它来引用它,但是在运行函数时我们还必须使用该名称,如下所示:

let result = square(number: 8)

Swift 允许我们为每个参数提供两个名称:一个在调用函数时在外部使用,一个在函数内部使用。这很简单,只需写两个名称,用空格隔开即可。

为了证明这一点,这里有一个使用两个名称作为字符串参数的函数:

func sayHello(to name: String) {print("Hello, \(name)!")
}

该参数被称为to name,这意味着它在外部被称为to,但在内部被称为name。这为函数内部的变量提供了一个合理的名称,但意味着调用该函数读起来很自然:

sayHello(to: "Taylor")

省略参数标签

您可能已经注意到,我们在调用时实际上并没有发送任何参数名称print()——我们说print(“Hello”)而不是print(message: “Hello”)。

您可以在自己的函数中通过使用下划线_作为外部参数名称来获得相同的行为,如下所示:

func greet(_ person: String) {print("Hello, \(person)!")
}

greet()现在无需使用参数名称即可进行调用person:

greet("Taylor")

这可以使一些代码更易于阅读,但通常最好为参数提供外部名称以避免混淆。例如,如果我说setAlarm(5)很难说出这是什么意思 - 是设置五点的闹钟,设置五小时后的闹钟,还是激活预配置的闹钟编号 5?

默认参数

该print()函数会在屏幕上打印一些内容,但总是在打印内容的末尾添加一个新行,以便多次调用print()不会都出现在同一行上。

您可以根据需要更改该行为,以便使用空格而不是换行符。不过,大多数情况下,人们希望换行,因此print()有一个terminator参数使用换行符作为其默认值。

你可以为自己的参数指定默认值,只需在=参数类型后写一个,然后输入你想要的默认值即可。因此,我们可以编写一个greet()可以选择性地打印友好问候的函数:

func greet(_ person: String, nicely: Bool = true) {if nicely == true {print("Hello, \(person)!")} else {print("Oh no, it's \(person) again...")}
}

可以通过两种方式调用:

greet("Taylor")
greet("Taylor", nicely: false)

可变参数函数

有些函数是可变的,这是一种奇特的说法,表示它们接受任意数量的相同类型的参数。该print()函数实际上是可变的:如果传递大量参数,它们将全部打印在一行上,中间有空格:

print(“Haters”, “gonna”, “hate”)
您可以通过在…参数类型后写出变量来使任何参数可变。因此,Int参数是一个整数,而参数Int…是零个或多个整数 - 可能是数百个。

在函数内部,Swift 将传入的值转换为整数数组,因此您可以根据需要循环它们。

为了尝试这一点,让我们编写一个square()可以对多个数字进行平方的函数:

func square(numbers: Int...) {for number in numbers {print("\(number) squared is \(number * number)")}
}

现在我们可以通过用逗号分隔传入大量数字来运行该程序:

square(numbers: 1, 2, 3, 4, 5)

编写抛出函数

有时函数会因为输入错误或内部出现问题而失败。Swift 允许我们从函数中抛出错误,方法是将它们标记为throws返回类型之前,然后throw在出现问题时使用关键字。

首先,我们需要定义一个enum描述我们可以抛出的错误。这些必须始终基于 Swift 的现有Error类型。我们将编写一个函数来检查密码是否正确,因此如果用户尝试了一个明显的密码,我们将抛出一个错误:

enum PasswordError: Error {case obvious
}

现在我们将编写一个checkPassword()函数,如果出现问题,该函数将抛出该错误。这意味着throws在函数的返回值之前使用关键字,然后throw PasswordError.obvious如果他们的密码是“password”,则使用。

Swift 版本如下:

func checkPassword(_ password: String) throws -> Bool {if password == "password" {throw PasswordError.obvious}return true
}

运行异常函数

Swift 不喜欢在程序运行时发生错误,这意味着它不会让您意外运行抛出错误的函数。

相反,您需要使用三个新关键字来调用这些函数:do启动一段可能导致问题的代码、try在每个可能引发错误的函数之前使用以及catch让您优雅地处理错误。

如果块内抛出任何错误do,执行将立即跳转到该catch块。让我们尝试checkPassword()使用抛出错误的参数进行调用:

do {try checkPassword("password")print("That password is good!")
} catch {print("You can't use that password.")
}

当该代码运行时,会打印“您不能使用该密码”,但不会有“该密码有效”——该代码永远不会被执行,因为会抛出错误。

输入输出参数

传递给 Swift 函数的所有参数都是常量,因此您无法更改它们。如果您愿意,可以将一个或多个参数作为 传入inout,这意味着它们可以在函数内部更改,并且这些更改会反映在函数外部的原始值中。

例如,如果您想将数字加倍(即直接更改该值而不是返回新值),您可以编写如下函数:

func doubleInPlace(number: inout Int) {number *= 2
}

要使用它,首先需要创建一个变量整数——不能将常量整数与 一起使用inout,因为它们可能会更改。您还需要在doubleInPlace参数&名称前使用与符号 来传递参数,这明确表明您知道它被用作inout。

在代码中你可以这样写:

var myNum = 10 
doubleInPlace(number: &myNum)

总结

让我们总结一下:

  • 函数让我们可以重复使用代码,而无需重复自己。
  • 函数可以接受参数——只需告诉 Swift 每个参数的类型。
  • 函数可以返回值,同样,您只需指定要返回的类型。如果您想返回多个值,请使用元组。
  • 您可以对外部和内部参数使用不同的名称,或者完全省略外部名称。
  • 参数可以有默认值,这可以帮助您在特定值很常见时编写更少的代码。
  • 可变参数函数接受零个或多个特定参数,Swift 将输入转换为数组。
  • 函数可以抛出错误,但您必须使用 调用它们try并使用 处理错误catch。
  • 您可以使用inout它来更改函数内的变量,但通常最好返回一个新值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/857594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java匿名类

Java 匿名类是一种特殊的内部类,它没有名字,并且通常用来简化代码实现,尤其是在实现接口或者抽象类的实例时。匿名类可以在实例化时定义其行为,而不需要创建单独的类文件。 匿名类的特点 没有名字:匿名类是没有名字的…

写代码必用字体

下载链接 字体下载链接 使用情况/截图 软件:DEV-CPP 系统:Win10专业版 自带判等、大于、小于等符号的专属字体

计算机组成原理网课笔记2

存储系统基本概念 CPU:运算器控制器。​ 作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。 ​ 主存储器的基本组成 半导体元件的原理 在电容上面的金属板加一个5V的高电平,产生电压差,电容里面的电荷就会开…

计算机系统基础实训五—CacheLab实验

实验目的与要求 1、让学生更好地应用程序性能的优化方法; 2、让学生更好地理解存储器层次结构在程序运行过程中所起的重要作用; 3、让学生更好地理解高速缓存对程序性能的影响; 实验原理与内容 本实验将帮助您了解缓存对C程序性能的影响…

带你学习Mybatis之MappedStatement

mybatis之MappedStatement MappedStatement是保存mapper.xml的一个节点(select|insert|delete|update),包括许多配置的sql、sql的id、缓存信息、resultMap、parameterType、resultType、languageDriver等重要配置内容 public final class MappedStatement { privat…

【面向对象】复习(二)

内存对齐 class A{ static int a; } int main(){ A obj; cout<<sizeof(obj); } 在你的代码中&#xff0c;class A 包含一个静态成员变量 a。静态成员变量不属于类的任何特定实例&#xff0c;而是属于整个类。因此&#xff0c;在计算类的实例大小时&#xff0c;静态…

如何在 Ubuntu 14.04 上使用 HAProxy 实现 SSL 终止

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 HAProxy&#xff0c;全称高可用代理&#xff0c;是一款流行的开源软件 TCP/HTTP 负载均衡器和代理解决方案&#xff0c;可在 Linu…

2024.6.22 刷题总结

2024.6.22 **每日一题** 2663.字典序最小的美丽字符串&#xff0c;该题考察了回文串的性质&#xff0c;一个回文串去掉首尾字母后&#xff0c;仍然是回文串&#xff0c;可以根据这一性质得到如果没有长度为m-2的回文串&#xff0c;那么就不会有长度为m的回文串.由答案取的是最小…

OpenXlab应用部署踩坑记录

参考博客&#xff1a; OpenXlab应用部署经验_xlabdemo-web-CSDN博客 书生浦语大模型实战营Day04OpenXLab 部署_openxlab.org.cn上传模型-CSDN博客 应用创建流程 | OpenXLab浦源 - 文档中心 1、已经在OpenXlab上上传好了模型 在上传好的模型查看一下如何使用模型 2、github…

colmap无GUI编译

cmake … -GNinja -DGUI_ENABLEDFalse

基于肤色模型的人脸识别,基于野火FPGA ZYNQ开发板

使用芯片为ZYNQ—7020&#xff0c;基于野火FPGA ZYNQ开发板 肤色模型简介 YCrCb也称为YUV&#xff0c;主要用于优化彩色视频信号的传输。与RGB视频信号传输相比&#xff0c;它最大的优点在于只需占用极少的频宽&#xff08;RGB要求三个独立的视频信号同时传输&#xff09;。其…

pytets测试框架中如果需要运行多个测试套件时pytest.ini文件设置

pytets测试框架中如果需要运行多个测试套件时pytest.ini文件设置方法 testpaths testcases/fenmi testcases/weixin testcases/Zgen

Java 和 Go 中的 byte 和 String 转换

背景 在讨论 Java 和 Go 中的 byte 和 String 之间的转换时&#xff0c;需要理解它们对字符串和字节数组的不同处理方式&#xff0c;尤其是对于编码和解码的策略。让我们深入探讨 Java 和 Go 在处理这些转换时的设计和实现。 Java 中的 byte[] 和 String 转换&#xff1a; Ja…

MQTTfx连接阿里云(详细版)

1、介绍 作为物联网开放平台&#xff0c;阿里云可谓是吸引大多数嵌入式爱好者的平台。物联网MQTT协议火热的今天&#xff0c;你使用过阿里云吗&#xff1f;本篇文章带你接触阿里云&#xff0c;实现MQTT通信。 我们在测试MQTT之前先了解下什么是MQTT协议。大家都知道它是一种发…

STM32之二:时钟树

目录 1. 时钟 2. STM3时钟源&#xff08;哪些可以作为时钟信号&#xff09; 2.1 HSE时钟 2.1.1 高速外部时钟信号&#xff08;HSE&#xff09;来源 2.1.2 HSE外部晶体电路配置 2.2 HSI时钟 2.3 PLL时钟 2.4 LSE时钟 2.5 LSI时钟 3. STM32时钟&#xff08;哪些系统使用时…

css-Echarts图表柱状图,X轴横坐标值显示不完全问题

1.问题 在Echarts图表中当横坐标数值过多&#xff0c;或者数值过长时会导致部分横坐标不显示。数据量少或简单会默认显示完全&#xff0c;当放大时会导致部分横坐标隐藏。 更改第一个Mon字段名 会发现偶数横坐标显示隐藏&#xff1b; 2.解决方法 2.1 在x横坐标中添加interval…

Autosar Dcm配置-0x23服务ReadMemoryByAddress-基于ETAS软件

文章目录 前言Dcm配置DcmDsdDcmDspDcmDspMemoryIdInfo 代码分析总结 前言 一般在调教开发阶段&#xff0c;会使用XCP进行观测和标定&#xff0c;本质上也是操作指定的内存地址。量产后&#xff0c;一般XCP会取消。本文介绍的UDS ReadMemoryByAddress服务&#xff0c;也是读取内…

关于jupyter notebook的使用经验

jupyter notebook 第一点&#xff0c;调整每次打开jupyter notebook的时候的位置第二点&#xff0c;如何设置jupyter notebook可以使用本地anaconda创建的虚拟环境呢&#xff1f;第三点&#xff0c;使用jupyter notebook的技巧 以下三点都是独立的&#xff0c;可以根据自己的需…

SHA256 安全散列算法加速器实验

1、SHA256 介绍 SHA256 加速器是用来计算 SHA-256 的计算单元&#xff0c; SHA256 是 SHA-2 下细分出的一种算法。 SHA-2 名称来自于安全散列算法 2 &#xff08;英语&#xff1a; Secure Hash Algorithm 2 &#xff09;的缩写&#xff0c;一种密码散列函 数算法标准…

zdppy_docserver结合zdpvue_client开发前后端分离的文档管理系统

创建前端应用 pnpm create vite安装依赖 pnpm add onlyoffice/document-editor-vue基本使用 这里有三个非常关键的URL地址&#xff1a; 文档服务地址&#xff1a;http://192.168.101.5:8080文档地址&#xff1a;http://192.168.101.5:18889/test.docx回调地址&#xff1a;h…