跳到主要内容

Swift函数的参数与返回值

提示
  1. Swift 函数参数:函数参数是函数接收的值,可以为参数设置默认值,并在函数调用时用实参替换默认值或省略某些默认值。
  2. 参数标签和 inout 参数:Swift 允许使用参数标签使函数调用更具表达力;使用 inout 参数可以在函数内修改传入的参数值。
  3. Swift 函数返回值:函数可以返回单个或多个值;返回多个值时,使用元组类型如 (Int, Int, Int) 来包含不同的返回值。

Swift 函数参数

函数参数是函数接受的值。

在了解函数参数和返回值之前,确保你已经了解了 Swift 函数

让我们看一个例子,

func addNumbers(a: Int, b: Int) {
var sum = a + b
print("Sum:", sum)
}

addNumbers(a: 2, b: 3)

输出

Sum: 5

在上面的例子中,函数 addNumbers() 接受两个参数:ab。注意这行,

addNumbers(a: 2, b: 3)

这里,a: 2, b: 3 指明了参数 ab 将分别获取值 23

注意:在函数调用过程中传递的值 23 也被称为实参。

具有默认值的函数参数

在 Swift 中,我们可以为函数参数提供默认值。

我们使用 = 运算符来提供默认值。例如,

func addNumbers( a: Int = 7,  b: Int = 8) {
var sum = a + b
print("Sum:", sum)
}

// 使用两个实参调用函数
addNumbers(a: 2, b: 3)

// 使用一个实参调用函数
addNumbers(a: 2)

// 不使用实参调用函数
addNumbers()

输出

Sum: 5
Sum: 10
Sum: 15

在上面的例子中,注意函数定义

func addNumbers(a: Int = 7, b: Int = 8) {
...
}

这里,我们为参数 ab 分别提供了默认值 78。以下是这个程序的工作原理

1. addNumbers(a: 2, b: 3)

在函数调用中传递了两个值。因此,这些值将被用于替代默认值。

2. addNumbers(a: 2)

在函数调用中只传递了参数 a 的值。因此,对于参数 b 使用默认值。

3. addNumbers()

在函数调用中没有传递任何值。因此,对于参数 ab 都使用默认值。

带有参数标签的函数

在 Swift 中,我们可以使用参数标签以富有表达力和类似句子的方式定义函数。例如,

func sum(of a: Int, and b: Int) {
...
}

这里,sum() 函数有参数标签:ofand

在调用函数时,我们可以使用参数标签而不是参数名称。例如,

sum(of: 2, and: 3)

这里,我们使用参数标签调用 sum() 函数,并传入值 23

示例:带有参数标签的函数

func sum(of a: Int, and b: Int) {
print("Sum:", a + b)
}

sum(of: 2, and: 3)

输出

Sum: 5

注意:调用函数时使用 sum(of: 2, and: 3)sum(a: 2, b: 3) 更加直观。

省略参数标签

我们也可以通过在参数名称前加 _ 来省略参数标签。例如,

func sum(_ a: Int, _ b: Int) {
print("Sum:", a + b)
}

sum(2, 3)

输出

Sum: 5

注意:如果我们在参数名称前使用 _,那么我们可以在调用函数时不使用参数标签或参数名称。

带变长参数的函数

有时,我们事先不知道将传递给函数的参数数量。为了处理这种情况,我们可以在 Swift 中使用变长参数。

变长参数允许我们在函数调用时传递不同数量的值。

我们在参数类型后使用 ... 符号来表示变长参数。例如,

// 编写一个计算多个数字总和的程序

func sum(numbers: Int...) {

var result = 0
for num in numbers {
result = result + num
}

print("总和 = \(result)")
}

// 使用 3 个参数调用函数
sum(numbers: 1, 2, 3)

// 使用 2 个参数调用函数
sum(numbers: 4, 9)

输出

总和 = 6
总和 = 13

在上述示例中,我们创建了接受变长参数的函数 sum()。注意这两行,

sum(numbers: 1, 2, 3)

sum(numbers: 4, 9)

这里,我们能够使用不同的参数调用同一个函数。

注意:在获得多个值后,numbers 表现为一个数组,所以我们可以使用 for 循环来访问每个值。

带 inout 参数的函数

当我们定义一个函数参数时,该参数在函数体内无法被修改。例如,

func changeName(name: String) {
if name == ""{
// 会产生错误
name = "Ross"
}
}

这里,上述代码会生成错误:错误:无法赋值:'name' 是一个 'let' 常量。这是因为参数表现为一个常量值。

为了解决这个问题,我们需要将参数定义为 inout 参数。例如,

func changeName(name: inout String) {
if name == "Ross" {
name = "Joey"
}
}

var userName = "Ross"
print("修改前: ", userName)

changeName(name: &userName)

print("修改后: ", userName)

输出

修改前: Ross
修改后: Joey

在上述示例中,我们声明了一个接受 inout 参数 name 的函数 changeName()

在调用带有 inout 参数的函数时,我们必须在作为参数传递的变量名前使用 和号(&)

changeName(name: &userName)

在内部,in-out 参数的值被传入函数,由函数修改,并被传出函数,以替换原始值。因此,在函数调用中传递的值必须是一个变量。

Swift 函数返回值

函数可能返回或不返回值。如果我们希望函数返回某些值,我们使用返回语句返回类型。例如,

func addNumbers(a: Int, b: Int) -> Int {
var sum = a + b
return sum
}

let result = addNumbers(a: 2, b: 3)

print("总和:", result)

输出

总和: 5

在上述示例中,我们创建了一个名为 addNumbers() 的函数。该函数将两个数字相加并返回 sum

return sum

返回的值存储在 result 变量中。

返回多个值的函数

函数也可以返回多个值。例如,

func checkMarks() -> (String, Int) {
...
return (message, marks)
}

这里,返回语句返回两个值:messagemarks

同时,-> (String, Int) 指定了返回类型 messagemarks。而且,顺序应该是相同的。也就是说,第一个返回的值应该是一个字符串,第二个应该是一个整数。

示例:多个返回值

func compute(number: Int) -> (Int, Int, Int) {

var square = number * number

var cube = square * number

return (number, square, cube)
}

var result = compute(number: 5)

print("数字:", result.0)
print("平方:", result.1)
print("立方:", result.2)

输出

数字: 5
平方: 25
立方: 125

在上述示例中,compute() 函数接受一个数字并计算该数字的平方和立方。注意这一行,

return (number, square, cube)

这里,函数一次返回数字、它的平方和立方值。

返回的值存储在 result 中。这里,result 是一个元组,可以存储多个值。要了解更多,请访问 Swift 元组

要从元组中访问单个值,我们使用索引号。这就是为什么 result.0 返回 5result.1 返回 25result.2 返回 125