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 变量的 引用。

你可能感兴趣的:(swift,学习,笔记)