2
2
3
3
定义和调用函数,标注参数并使用其返回值。
4
4
5
- * 函数(Functions)* 是执行特定任务的独立代码块。
5
+ ** 函数(Functions)* * 是执行特定任务的独立代码块。
6
6
你可以通过给函数命名来标识某个函数的功能,这个名字可以被用来在需要的时候“调用”这个函数来完成它的任务。
7
7
8
8
Swift 的统一函数语法非常灵活,从没有形参名称的简单 C 风格函数到每个形参都有局部和外部参数名的复杂 Objective-C 风格方法,它都能表达。
@@ -13,11 +13,11 @@ Swift 中的每个函数都有一个类型,由函数的形参值类型和返
13
13
或者还可以在其他函数中编写函数,以便在嵌套函数作用域中封装功能。
14
14
15
15
## 定义和调用函数
16
- 定义函数时,您可以定义一个或多个有名字和类型的值,作为函数的输入,即 * 形参 * 。
17
- 您还可以选择性地定义某种类型的值作为函数执行结束时的输出,即函数的 * 返回类型* 。
16
+ 定义函数时,您可以定义一个或多个有名字和类型的值,作为函数的输入,即 ** 形参 * * 。
17
+ 您还可以选择性地定义某种类型的值作为函数执行结束时的输出,即函数的 ** 返回类型* * 。
18
18
19
- 每个函数都有一个 * 函数名* ,它描述了函数执行的任务。
20
- 要使用函数,您需要使用函数名“调用”该函数,并向其传递与函数形参类型相匹配的输入值(称为 * 实参 * )。
19
+ 每个函数都有一个 ** 函数名* * ,它描述了函数执行的任务。
20
+ 要使用函数,您需要使用函数名“调用”该函数,并向其传递与函数形参类型相匹配的输入值(称为 ** 实参 * * )。
21
21
函数的实参必须与函数形参表里的顺序一致。
22
22
23
23
下面示例中的函数名为 'greet(person:)',因为它要做的就是接收一个人的姓名作为输入,并返回对这个人的问候语句。
@@ -41,8 +41,8 @@ func greet(person: String) -> String {
41
41
```
42
42
-->
43
43
44
- 所有这些信息都汇总起来成为函数的 * 定义(definition)* ,并以 * func* 作为前缀。
45
- 使用 * 返回箭头* ` -> ` (连字符后跟一个直角括号),后面跟要返回的类型名称,来表示函数的返回类型。
44
+ 所有这些信息都汇总起来成为函数的 ** 定义(definition)** ,并以 ** func* * 作为前缀。
45
+ 使用 ** 返回箭头* * ` -> ` (连字符后跟一个直角括号),后面跟要返回的类型名称,来表示函数的返回类型。
46
46
47
47
定义描述了函数的作用、期望接收的内容以及完成后的返回内容。
48
48
有了定义,就可以在代码的其他地方明确地调用函数:
@@ -200,7 +200,7 @@ greet(person: "Dave")
200
200
因为这个函数不需要返回值,所以这个函数的定义中没有返回箭头(` -> ` )和返回类型。
201
201
202
202
> 注意:
203
- > 严格来说,这个版本的 ` greet(person:) ` 函数 * 确实 * 仍然返回一个值,即使没有定义返回值。
203
+ > 严格来说,这个版本的 ` greet(person:) ` 函数 ** 确实 * * 仍然返回一个值,即使没有定义返回值。
204
204
> 没有定义返回类型的函数会返回 ` Void ` 类型的特殊值。
205
205
> 这是一个空元组,写成 ` () ` 。
206
206
@@ -333,7 +333,7 @@ print("min is \(bounds.min) and max is \(bounds.max)")
333
333
334
334
#### 可选元组返回类型
335
335
336
- 如果函数返回的元组类型有可能整个元组都“没有值”,你可以使用 * 可选 * 元组返回类型反映整个元组可以是 ` nil ` 的事实。
336
+ 如果函数返回的元组类型有可能整个元组都“没有值”,你可以使用 ** 可选 * * 元组返回类型反映整个元组可以是 ` nil ` 的事实。
337
337
您可以通过在元组类型的结尾括号后放置问号来定义可选的元组返回类型,例如 ` (Int, Int)? ` 或 ` (String, Int, Bool)? ` 。
338
338
339
339
> 注意: 可选元组类型如 ` (Int, Int)? ` 与元组包含可选类型如 ` (Int?, Int?) ` 是不同的。
@@ -469,7 +469,7 @@ print(anotherGreeting(for: "Dave"))
469
469
470
470
## 函数参数标签和参数名称
471
471
472
- 每个函数参数都有一个 * 参数标签(argument label)* 和 * 参数名称(parameter name)* 。
472
+ 每个函数参数都有一个 ** 参数标签(argument label)** 和 ** 参数名称(parameter name)* * 。
473
473
参数标签在调用函数时使用;调用的时候需要将函数的参数标签写在对应的参数前面。
474
474
参数名称用于函数的实现;
475
475
默认情况下,函数参数使用参数名称来作为它们的参数标签。
@@ -575,11 +575,11 @@ someFunction(1, secondParameterName: 2)
575
575
```
576
576
-->
577
577
578
- 如果参数有参数标签,则在调用函数时 * 必须 * 使用标签来标示参数。
578
+ 如果参数有参数标签,则在调用函数时 ** 必须 * * 使用标签来标示参数。
579
579
580
580
### 默认参数值
581
581
582
- 你可以在函数体中通过给参数赋值来为任意一个 * 参数定义默认值(Deafult Value)* 。
582
+ 你可以在函数体中通过给参数赋值来为任意一个 ** 参数定义默认值(Deafult Value)* * 。
583
583
如果定义了默认值,您就可以在调用函数时省略该参数。
584
584
585
585
``` swift
@@ -608,14 +608,14 @@ someFunction(parameterWithoutDefault: 4) // parameterWithDefault is 12
608
608
609
609
### 可变参数
610
610
611
- * 可变参数(variadic parameter)* 接受零个或多个指定类型的值。
611
+ ** 可变参数(variadic parameter)* * 接受零个或多个指定类型的值。
612
612
使用可变参数可以指定在调用函数时,参数可以传入不同数量的输入值。
613
613
通过在参数类型名称后插入三个句点字符(` ... ` )来编写可变参数。
614
614
615
615
可变参数的值将在函数体中变为相应类型的数组。
616
616
例如,名称为 ` numbers ` 和类型为 ` Double... ` 的可变参数,在函数体中以名为 ` numbers ` 类型为 ` [Double] ` 的数组常量形式提供。
617
617
618
- 下面的示例计算任意长度数字列表的 * 算术平均数(arithmetic mean)* (也称为 * 平均值(average)* ):
618
+ 下面的示例计算任意长度数字列表的 ** 算术平均数(arithmetic mean)** (也称为 ** 平均值(average)* * ):
619
619
620
620
``` swift
621
621
func arithmeticMean (_ numbers : Double ... ) -> Double {
@@ -694,12 +694,12 @@ arithmeticMean(3, 8.25, 18.75)
694
694
函数参数默认为常量。
695
695
在函数体中更改函数参数的值会导致编译时错误。
696
696
这意味着您不能错误地更改参数的值。
697
- 如果您希望函数修改参数的值,并希望这些更改在函数调用结束后仍然有效,请将该参数定义为 * in-out parameter(输入输出参数)* 。
697
+ 如果您希望函数修改参数的值,并希望这些更改在函数调用结束后仍然有效,请将该参数定义为 ** in-out parameter(输入输出参数)* * 。
698
698
699
699
一个 输入输出参数有传入函数的值,这个值被函数修改,然后被传出函数,替换原来的值。想获取更多的关于输入输出参数的细节和相关的编译器优化,请查看 输入输出参数 一节。
700
700
701
701
您可以通过在参数类型前添加 ` inout ` 关键字来编写输入输出参数。
702
- 输入输出参数有一个值,该值 * 传入* 给函数,被函数修改后,然后被 * 传出 * 函数,以替换原来的值。
702
+ 输入输出参数有一个值,该值 ** 传入** 给函数,被函数修改后,然后被 ** 传出 * * 函数,以替换原来的值。
703
703
有关传入传出参数行为及相关编译器优化的详细讨论,请参阅 < doc:Declarations#In-Out-Parameters > 。
704
704
705
705
你只能传递变量给输入输出参数。
@@ -771,7 +771,7 @@ print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
771
771
772
772
## 函数类型
773
773
774
- 每个函数都有一个特定的 * 函数类型* ,由函数的参数类型和返回类型组成。
774
+ 每个函数都有一个特定的 ** 函数类型* * ,由函数的参数类型和返回类型组成。
775
775
776
776
例如:
777
777
@@ -1061,8 +1061,8 @@ print("zero!")
1061
1061
1062
1062
## 嵌套函数
1063
1063
1064
- 到目前为止,您在本章中遇到的所有函数都是 * 全局函数(global functions)* ,它们定义在全局域中。
1065
- 您还可以在其他函数的主体中定义函数,即 * 嵌套函数(nested functions)* 。
1064
+ 到目前为止,您在本章中遇到的所有函数都是 ** 全局函数(global functions)* * ,它们定义在全局域中。
1065
+ 您还可以在其他函数的主体中定义函数,即 ** 嵌套函数(nested functions)* * 。
1066
1066
1067
1067
默认情况下,嵌套函数是对外界不可见的,但仍可被其外围函数(enclosing function)调用。
1068
1068
外围函数也可以返回它的某个嵌套函数,以便在另一个作用域中使用这个函数。
0 commit comments