Swift 函数参数和返回值
在本教程中,我们将通过示例学习 Swift 中的函数参数和返回值。
Swift 函数参数
函数参数是函数接受的值。
在学习函数参数和返回值之前,请确保了解 Swift 函数。
让我们看一个例子,
func addNumbers(a: Int, b: Int) {var sum = a + bprint("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。
具有默认值的函数参数
在 Swift 中,我们可以为函数参数提供默认值。
我们使用 = 运算符提供默认值。例如,
func addNumbers( a: Int = 7, b: Int = 8) {var sum = a + bprint("Sum:", sum)}// function call with two argumentsaddNumbers(a: 2, b: 3)// function call with one argumentaddNumbers(a: 2)// function call with no argumentsaddNumbers()
结果如下:
Sum: 5Sum: 10Sum: 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)
这里,我们使用参数标签调用值为 2 和 3 的 sum()。
实例
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 numbersfunc sum( numbers: Int...) {var result = 0for num in numbers {result = result + num}print("Sum = \(result)")}// function call with 3 argumentssum(numbers: 1, 2, 3)// function call with 2 argumentssum (numbers: 4, 9)
结果如下:
Sum = 6Sum = 13
在上面的实例中,我们创建了接受可变参数的函数 sum()。注意这一句,
sum(numbers: 1, 2, 3)sum(numbers: 4, 9)
这里,我们可以用不同的参数调用相同的函数。
for 循环访问每个值。具有 inout 参数的函数
定义函数参数时,不能在函数体内修改函数参数。例如,
func changeName(name: String) {if name == ""{// Cause Errorname = "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: RossAfter: Joey
在上面的实例中,我们声明了一个接受 inout 参数 name 的函数 changeName()。
当使用 inout 参数调用函数时,我们必须在变量名作为参数传递之前使用 ampersand(&)。
changeName(name: &userName)
in-out 参数有一个值,该值传递给函数,由函数修改,然后从函数传回以替换原始值。因此,函数调用中传递的值必须是变量。
Swift 函数返回值
函数可能返回值,也可能不返回值。如果我们希望函数返回一些值,我们将使用 return 语句和 return 类型。例如,
func addNumbers(a: Int, b: Int) -> Int {var sum = a + breturn sum}let result = addNumbers(a: 2, b: 3)print("Sum:", result)
结果为:
Sum: 5
在上面的实例中,我们创建了一个名为 addNumbers() 的函数。函数将两个数字相加并返回总和。
return sum
返回的值存储在结果变量中。
返回多个值的函数
函数还可以返回多个值。例如,
func checkMarks() -> (String, Int) {...return (message, marks)}
这里,return 语句返回两个值:message 和 marks。
此外,-> (String, Int) 指定返回类型消息和标记。而且,顺序应该相同。也就是说,第一个返回值应该是字符串,第二个应该是整数。
实例
func compute(number: Int) -> (Int, Int, Int) {var square = number * numbervar cube = square * numberreturn (number, square, cube)}var result = compute(number: 5)print("Number:", result.0)print("Square:", result.1)print("Cube:", result.2)
结果如下:
Number: 5Square: 25Cube: 125
在上面的实例中,compute() 函数接受一个数字,并计算该数字的平方和立方体。注意这一行,
return (number, square, cube)
在这里,函数同时返回数字、其平方和立方体值。
返回的值存储在结果中。在这里,结果是一个存储多个值的元组。要了解更多信息,请访问 Swift Tuple。
要访问元组中的单个值,我们使用索引号。结果就是 result.0 返回 5,result.1 返回 25,result.2 返回 125。