Swift 函数参数和返回值

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 分别获得值 **2** 和 **3**。

注意:在函数调用期间传递的值 **2** 和 **3** 也称为实参。


带有默认值的函数参数

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

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

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

// function call with two arguments
addNumbers(a: 2, b: 3)

// function call with one argument
addNumbers(a: 2)

// function call with no arguments
addNumbers()

输出

Sum: 5
Sum: 10
Sum: 15

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

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

在这里,我们分别为参数 a 和 b 提供了默认值 **7** 和 **8**。这个程序的工作方式如下:

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(),值为 **2** 和 **3**。


示例:带实参标签的函数

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 中使用可变参数。

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

我们使用参数类型后的 ... 字符来表示可变参数。例如,

// program to find sum of multiple numbers 

func sum( numbers: Int...) {

  var result = 0
  for num in numbers {
    result = result + num
  }
  
  print("Sum = \(result)")
}

// function call with 3 arguments
sum(numbers: 1, 2, 3)

// function call with 2 arguments
sum (numbers: 4, 9)

输出

Sum = 6
Sum = 13

在上面的示例中,我们创建了 sum() 函数,它接受可变参数。注意这些行:

sum(numbers: 1, 2, 3)

sum(numbers: 4, 9)

这里,我们可以用不同的实参调用同一个函数。

注意:在获取多个值后,numbers 的行为类似于数组,因此我们可以使用 for 循环来访问每个值。


带 inout 参数的函数

当我们定义函数参数时,函数参数不能在函数体内修改。例如,

func changeName(name: String) {
  if name == ""{
    // Cause Error
    name = "Ross"
  }
}

这里,上面的代码将生成一个错误:Error: cannot assign to value: 'name' is a 'let' constant。这是因为参数的行为是常量值。

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

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

var userName = "Ross"
print("Before: ", userName)

changeName(name: &userName)

print("After: ", userName)

输出

Before:  Ross
After:  Joey

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

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

changeName(name: &userName)

在幕后,in-out 参数具有一个值,该值被传递到函数中,由函数修改,然后又传递回函数以替换原始值。因此,传递到函数调用中的值必须是变量。


Swift 函数返回值

函数可以返回值,也可以不返回值。如果我们希望函数返回某个值,我们使用 return 语句return 类型。例如,

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

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

print("Sum:", result)

输出

Sum: 5

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

return sum

返回值存储在 result 变量中。


返回多个值的函数

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

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

这里,return 语句返回两个值: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("Number:", result.0)
print("Square:", result.1)
print("Cube:", result.2)

输出

Number: 5
Square: 25
Cube: 125

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

return (number, square, cube)

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

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

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

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战