Swift 函数参数
函数参数是函数接受的值。
在学习函数参数和返回值之前,请确保了解 Swift 函数。
让我们看一个例子,
func addNumbers(a: Int, b: Int) {
var sum = a + b
print("Sum:", sum)
}
addNumbers(a: 2, b: 3)
输出
Sum: 5
在上面的示例中,函数 addNumbers()
接受两个参数:a
和 b
。注意这一行,
addNumbers(a: 2, b: 3)
这里,a: 2, b: 3
指定参数 a
和 b
分别获得值 **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()
在函数调用时没有传递任何值。因此,参数 a
和 b
都使用默认值。
带有实参标签的函数
在 Swift 中,我们可以使用实参标签以一种富有表现力且类似句子的方式来定义函数。例如,
func sum(of a: Int, and b: Int) {
...
}
这里,sum()
函数具有实参标签:of
和 and
。
调用函数时,我们可以使用实参标签而不是参数名。例如,
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 语句返回两个值:message 和 marks。
此外,-> (String, Int)
指定了 message
和 marks
的返回类型。而且,顺序应该是相同的。也就是说,第一个返回值应该是字符串,第二个应该是整数。
示例:多个返回值
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**。