Swift学习笔记四(function 篇)

 

目录

 

1 Function 概念及定义。

1.1 Function概念

1.2 Function定义

1.3 Function参数

1.3.1 无形式参数

1.3.2 多形式参数的函数

1.4 返回值

1.4.1 无返回值类型

1.4.2 多返回值类型

1.4.3 可选元组返回类型

1.4.4 隐式返回的类型

1.4.5 实参标签和形参名

1.4.6 指定实际参数标签

1.4.7 省略实际参数标签

1.4.8 默认形式参数值

1.4.9 可变形式参数

1.4.10 输入输出形式参数

1.4.11 函数类型和内嵌函数

1.4.12 函数类型作为形式参数类型

1.4.13 函数类型作为返回类型

1.4.14 内嵌函数

2 Function 闭包

2.1 闭包概念

2.2 闭包表达式

2.2.1 闭包表达式

2.2.2闭包表达式语法版本的 backward

2.2.3从语境中推断类型

2.2.4从单表达式闭包隐式返回

2.2.5简写实际参数名

2.2.6 运算符函数

2.2.7 尾随闭包

2.2.8 Function捕获值


1 Function 概念及定义。

1.1 Function概念

  • 函数是一个独立的代码块,用来执行特定的任务。通过给函数一个名字来定义它的功能,并且在需要 的时候,通过这个名字来“调用”函数执行它的任务。
  • Swift 统一的函数语法十分灵活,可以表达从简单的无形式参数的 C 风格函数到复杂的每一个形式参 数都带有局部和外部形式参数名的 Objective-C 风格方法的任何内容。形式参数能提供一个默认的值 来简化函数的调用,也可以被当作输入输出形式参数被传递,它在函数执行完成时修改传递来的变 量。
  • Swift 中的每一个函数都有类型,由函数的形式参数类型和返回类型组成。你可以像 Swift 中其他类 型那样来使用它,这使得你能够方便的将一个函数当作一个形式参数传递到另外的一个函数中,也可 以在一个函数中返回另一个函数。函数同时也可以写在其他函数内部来在内嵌范围封装有用的功能。

1.2 Function定义

  • 当你定义了一个函数的时候,你可以选择定义一个或者多个命名的分类的值作为函数的输入(所谓的形式参数),并且/或者定义函数完成后将要传回作为输出的值的类型(所谓它的返回类型)。
  • 每一个函数都有一个函数名,它描述函数执行的任务。要使用一个函数,你可以通过“调用” 函数的名字并且传入一个符合函数形式参数类型的输入值(所谓实际参数)来调用这个函数。 给函数提供的实际参数的顺序必须符合函数的形式参数列表顺序。

1.3 Function参数

1.3.1 无形式参数

  • 函数没有要求必须输入一个参数,可以没有形式参数。
  •  函数的定义仍然需要在名字后边加一个圆括号,即使它不接受形式参数也得这样做。当函数被调用的时候也要在函数的名字后边加一个空的圆括号。

1.3.2 多形式参数的函数

  • 函数可以输入多个形式参数,可以写在函数后边的圆括号内,用逗号分隔。

1.4 返回值

1.4.1 无返回值类型

  • 函数定义中没有要求必须有一个返回类型。
  • 需要返回值,函数在定义的时候就没有包含返回箭头( ->)或者返回类型。
  • 严格来讲,函数 greet(person:)还是有一个返回值的,尽管没有定义返回值。没有定义返回类 型的函数实际上会返回一个特殊的类型 Void。它其实是一个空的元组,作用相当于没有元素的 元组,可以写作 () 。

1.4.2 多返回值类型

  • 为了让函数返回多个值作为一个复合的返回值,你可以使用元组类型作为返回类型。

1.4.3 可选元组返回类型

  • 如果元组在函数的返回类型中有可能“没有值”,你可以用一个可选元组返回类型来说明整个元组的可能 是 nil 。写法是在可选元组类型的圆括号后边添加一个问号( ?)例如 (Int, Int)? 或者 (String, Int, Bool)? 。

1.4.4 隐式返回的类型

  • 如果整个函数体是一个单一表达式,那么函数隐式返回这个表达式。

1.4.5 实参标签和形参名

  • 每一个函数的形式参数都包含实际参数标签和形式参数名。实际参数标签用在调用函数 的时候;在调用函数的时候每一个实际参数前边都要写实际参数标签。形式参数名用在 函数的实现当中。默认情况下,形式参数使用它们的形式参数名作为实际参数标签。
  •  所有的形式参数必须有唯一的名字。尽管有可能多个形式参数拥有相同的实际参数标 签,唯一的实际参数标签有助于让你的代码更加易读。

1.4.6 指定实际参数标签

  • 在提供形式参数名之前写实际参数标签,用空格分隔。
  • 如果你为一个形式参数提供了实际参数标签,那么这个实际参数就必须在调用函数的时候使用标签。
  • 实际参数标签的使用能够让函数的调用更加明确,更像是自然语句,同时还能提供更可读的函数体并更清晰地表达你的意图。

1.4.7 省略实际参数标签

  • 如果对于函数的形式参数不想使用实际参数标签的话,可以利用下划线( _ )来为 这个形式参数代替显式的实际参数标签。

1.4.8 默认形式参数值

  • 你可以通过在形式参数类型后给形式参数赋一个值来给函数的任意形式参数定义一 个默认值。
  •  如果定义了默认值,你就可以在调用函数时候省略这个形式参数。

1.4.9 可变形式参数

  • 一个可变形式参数可以接受零或者多个特定类型的值。当调用函数的时候你可以利 用可变形式参数来声明形式参数可以被传入值的数量是可变的。可以通过在形式参 数的类型名称后边插入三个点符号( …)来书写可变形式参数。
  • 传入到可变参数中的值在函数的主体中被当作是对应类型的数组。

1.4.10 输入输出形式参数

  • 可变形式参数只能在函数的内部做改变。如果你想函数能够修改一个形式参数的值,而且你想这些改变在函 数结束之后依然生效,那么就需要将形式参数定义为输入输出形式参数。
  • 在形式参数定义开始的时候在前边添加一个 inout 关键字可以定义一个输入输出形式参数。输入输出形式参 数有一个能输入给函数的值,函数能对其进行修改,还能输出到函数外边替换原来值。
  • 你只能把变量作为输入输出形式参数的实际参数,在将变量作为实际参数传递给输入输出形式参数的时候,直接在它前边添加一个和符号 ( &) 来明确可以被函数修改。
  • 输入输出形式参数不能有默认值,可变形式参数不能标记为 inout。

1.4.11 函数类型和内嵌函数

  • 每一个函数都有一个特定的函数类型,它由形式参数类型,返回类型组成。
  • 你可以像使用 Swift 中的其他类型一样使用函数类型。例如,你可以给一个常量或变 量定义一个函数类型,并且为变量指定一个相应的函数。

1.4.12 函数类型作为形式参数类型

  • 你可以利用使用一个函数的类型例如 (Int, Int) -> Int 作为其他函数的形式参数类型。
    这允许你预留函数的部分实现从而让函数的调用者在调用函数的时候提供。

1.4.13 函数类型作为返回类型

  • 你可以利用使用一个函数的类型例如 (Int, Int) -> Int 作为其他函数的形式参数类型。这允许你预留函数的部分实现从而让函数的调用者在调用函数的时候提供。
  • 你可以利用函数的类型作为另一个函数的返回类型。写法是在函数的返回箭头( ->)后立即写一个完整的函数类型。

1.4.14 内嵌函数

  • 可以在函数的内部定义另外一个函数。这就是内嵌函数。
  • 内嵌函数在默认情况下在外部是被隐藏起来的,但却仍然可以通过包裹它们的函数来 调用它们。包裹的函数也可以返回它内部的一个内嵌函数来在另外的范围里使用。

2 Function 闭包

2.1 闭包概念

  • 闭包是可以在你的代码中被传递和引用的功能性独立代码块。
  • 闭包能够捕获和存储定义在其上下文中的任何常量和变量的引用,这也就是所谓的闭 合并包裹那些常量和变量,因此被称为“闭包”,Swift 能够为你处理所有关于捕获 的内存管理的操作。
  • 在函数章节中有介绍的全局和内嵌函数,实际上是特殊的闭包。闭包符合如下三种形式中的一种:
  • a. 全局函数是一个有名字但不会捕获任何值的闭包;
  • b. 内嵌函数是一个有名字且能从其上层函数捕获值的闭包;
  • c. 闭包表达式是一个轻量级语法所写的可以捕获其上下文中常量或变量值的没有名字的闭包。

2.2 闭包表达式

2.2.1 闭包表达式

  • 闭包表达式是一种在简短行内就能写完闭包的语法。
  • Swift 的标准库提供了一个叫做 sorted(by:) 的方法,会根据你提供的排序闭包将已知类型 的数组的值进行排序。一旦它排序完成, sorted(by:) 方法会返回与原数组类型大小完全相 同的一个新数组,该数组的元素是已排序好的。原始数组不会被 sorted(by:) 方法修改。
  • 闭包表达式语法能够使用常量形式参数、变量形式参数和输入输出形式参数,但不能提供默认值。可变形式参数也能使用,但需要在形式参数列表的最后面使用。元组也可被用来作为形式参数和返回类型。

2.2.2闭包表达式语法版本的 backward

  • 将之前 backward(_:_:) 函数改为闭包表达版本。

2.2.3从语境中推断类型

  • 因排序闭包为实际参数来传递给函数,故 Swift 能推断它的形式参数类型和返回类型。
  • sorted(by:) 方法期望它的形式参数是一个 (String, String) -> Bool 类型的函数。这 意味着(String, String)和 Bool 类型不需要被写成闭包表达式定义中的一部分,因为 所有的类型都能被推断,返回箭头 ( ->) 和围绕在形式参数名周围的括号也能被省略。

2.2.4从单表达式闭包隐式返回

  • 单表达式闭包能够通过从它们的声明中删掉 return 关键字来隐式返回它们单个表达式 的结果。

2.2.5简写实际参数名

  • Swift 自动对行内闭包提供简写实际参数名,可以通过 $0 , $1 , $2 等名字来引用闭包的实际参数值。

2.2.6 运算符函数

  • Swift 的 String 类型定义了关于大于号( >)的特定字符串实现,让其作为一个有两 个 String 类型形式参数的函数并返回一个 Bool 类型的值。这正好与 sorted(by:) 方 法的形式参数需要的函数相匹配。因此,你能简单地传递一个大于号,并且 Swift 将 推断你想使用大于号特殊字符串函数实现。

2.2.7 尾随闭包

  • 如果你需要将一个很长的闭包表达式作为函数最后一个实际参数传递给函数,使用尾随闭包将增强函数的可读性。尾随闭包是一个被书写在函数形式参数的括号外面(后面)的闭包表达式。

2.2.8 Function捕获值

  • 一个闭包能够从上下文捕获已被定义的常量和变量。即使定义这些常量和变量的原作 用域已经不存在,闭包仍能够在其函数体内引用和修改这些值。
  • 作为一种优化,如果一个值没有改变或者在闭包的外面,Swift 可能会使用这个值的 拷贝而不是捕获。
  • Swift也处理了变量的内存管理操作,当变量不再需要时会被释放。
  • 如果你建立了第二个 incrementer ,它将会有一个新的、独立的 runningTotal 变量的 引用。

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

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

相关文章

卷积神经网络:深度学习的重要支柱

卷积神经网络:深度学习的重要支柱 卷积神经网络(Convolutional Neural Network,简称CNN)是深度学习领域中最著名的算法之一。它是一种特殊的神经网络,尤其适用于处理图像、视频等网格形式的数据。自从1998年Yann LeCun…

功率放大器的定义详解

功率放大器是一种电子放大器,主要用于将输入信号的功率放大到足以驱动负载或输出器件所需的水平。通常,功率放大器会将低电平高电流的输入信号转换成高电平低电流的输出信号,以便给负载提供足够的功率。 功率放大器广泛应用于各种应用场合&am…

Linux工具——gcc

目录 一,gcc简介 二,C语言源文件的编译过程 1.预处理 2.编译 3.汇编 4.链接 5.动静态库 一,gcc简介 相信有不少的小白和我一样在学习Linux之前只听说过visual studio。其实这个gcc这个编译器实现的功能便是和visual studio一样的功能&…

学习 [Spring MVC] 的JSR 303和拦截器,提高开发效率

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《推荐】Spring与Mybatis集成整合》 ⛺️ 生活的理想,不断更新自己 ! 1.JSR303 1.1JSR303是什么 JSR 303是Java规范请求(Java Specification Request)…

matlab数据处理: cell table array+datetime

原数据文件.csv matlab xlsread(filename{i},B2:T2881) 会同于Excel最多1048576行 舍弃 a{1,i} xlsread(filename{i},‘B2:T2881’);%读取excel文件,选定区域’B2:G2881’ readcell(filename{i},Range,E2:M2881) 会全部读取 优选 对于日期 yyyy-MM-dd HH:mm:ss.000 matlab cel…

在Ubuntu上建立博客网站,利用Cpolar+Inis快速实现专业写作

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总…

设计模式-模板方法

文章目录 前言模板方法模式简介Java代码示例模板方法使用场景模板方法使用场景 前言 当我们需要在一个算法的框架中定义算法的骨架,并将一些步骤的具体实现留给子类来完成时,模板方法模式是一种非常有用的设计模式。这篇博客将介绍模板方法模式的概念&a…

将 ChatGPT 用于数据科学项目的指南

推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 我们都知道 ChatGPT 的受欢迎程度以及人们如何使用它来提高生产力。但是,如果您是新手,则值得注册ChatGPT免费演示并尝试它所能做的一切。您还应该参加我们的 ChatGPT 简介课程,学习…

199. 二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输入: [] 输出: []提示: 二…

Mixin从理论到实践

mixin从理论到实践 mixin从理论到实践一、什么是mixin二、使用mixin三、mixin的合并策略四、mixin辨析五、个人实践 mixin从理论到实践 一、什么是mixin mixin混入 — Vue.js (vuejs.org) 官方解释: 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue …

产品波士顿矩阵

随着公司产品的增多,每个产品的生命周期节点各不相同,很多时候我们往往在产品结构、资源分配方面会产生各种问题,导致需要发展的产品得不到资源,消耗资源的产品却有无法增长,所谓不聚焦导致的问题其实是资源和发展错配…

ESP32蓝牙实例-BLE服务器与客户端通信

BLE服务器与客户端通信 文章目录 BLE服务器与客户端通信1、软件准备2、硬件准备3、代码实现3.1 BLE服务器实现3.2 Android手机测试BLE服务器3.3 ESP32 BLE客户端在本文中,我们将介绍如何使用低功耗蓝牙在两个 ESP32 开发板之间执行 BLE 服务器客户端通信。 换句话说,将介绍如…

Sphinx 找不到 Doxygen 导出的 xml 中的内容的解决方法

Sphinx Breathe Doxygen CMake 的教程看这个就够了 https://devblogs.microsoft.com/cppblog/clear-functional-c-documentation-with-sphinx-breathe-doxygen-cmake/ 但是他还是少写了一些东西,所以还是有一些小坑的 这些坑会导致 Sphinx 找不到 Doxygen 导出…

使用 PHP WorkerMan 构建 WebSocket 全双工群聊通信(二)

在很早很早以前,WebSocket 协议还没有被发明的时候,人们在 Web 端制作类实时数据动态更新时,一般采用轮询、 长连接 (Long Polling) 来实现。大概就是: 轮询:客户端不停发送 HTTP 请求给服务端,服务端返回…

在阿里云 linux 服务器上查看当前服务器的Nginx配置信息

我们可以通过命令 sudo nginx -t查看到nginx.conf的路径 可以通过 sudo nginx -T查看 nginx 详细配置信息,包括加载的配置文件和配置块的内容 其中也会包括配置文件的内容

环境扫描/透射电子显微镜气体样品架的真空压力和微小流量控制解决方案

摘要:针对环境扫描/透射电子显微镜对样品杆中的真空压力气氛环境和流体流量精密控制控制要求,本文提出了更简单高效和准确的国产化解决方案。解决方案的关键是采用动态平衡法控制真空压力,真空压力控制范围为1E-03Pa~0.7MPa;采用压…

git 合并分支某次(commit)提交

需求:将develop分支某次提交合并到master上面,其他修改不同步; //切换到master分支 git checkout master //查看develop分支提交记录,获取对应记录哈希值; git log develop // 按上下按钮可以上下查询对应记录&#xf…

typeScript--[接口interface的继承]

和类一样,接口也可以通过关键字 extents 相互继承。接口继承,分为:单继承和多继承,即继承多个接口。另外,接口也可以继承类,它会继承类的成员,但不包括具体的实现,只会把类的成员作为…

DevOps到底是什么意思?

前言: 当我们谈到 DevOps 时,可能讨论的是:流程和管理,运维和自动化,架构和服务,以及文化和组织等等概念。那么,到底什么是"DevOps"呢? 那么,DevOps是什么呢? 有人说它是一种方法,也有人说它是一种工具,还有人说它是一种思想。更有甚者,说它是一种哲学…

读高性能MySQL(第4版)笔记06_优化数据类型(上)

1. 良好的逻辑设计和物理设计是高性能的基石 1.1. 反范式的schema可以加速某些类型的查询,但同时可能减慢其他类型的查询 1.2. 添加计数器和汇总表是一个优化查询的好方法,但它们的维护成本可能很 1.3. 将修改schema作为一个常见事件来规划 2. 让事情…