Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数
7.4.4 为外部参数设置默认值
开发者也可以对外部参数设置默认值。这时,调用的时候,也可以省略参数传递本文选自Swift1.2语言快速入门v2.0。
【示例7-11】以下的代码就为外部参数toString、withJoiner设置了默认的参数"Swift"和"---"。代码如下:
- import Foundation
- func join(string s1: String, toString s2: String="Swift", withJoiner joiner:String="---"){
- println("\(s1)\(joiner)\(s2)")
- }
- join(string:"Hello")
由于toString和withJoiner已经设置了默认值,所以调用的时候就省略对两个参数的传值。运行结果如下所示:
- Hello---Swift
7.4.5 可变参数
使用可变参数,可以使一个参数接受零个或多个指定类型的值。设定一个可变参数需要在参数类型名后添加“...”本文选自Swift1.2语言快速入门v2.0。
【示例7-12】下面代码使用可变参数计算任意数字的算术平均值。代码如下:
- import Foundation
- func average(numbers: Double...){
- var total: Double = 0
- for number in numbers {
- total += number
- }
- println(total/Double(numbers.count))
- }
- average(1, 2, 3, 4, 5)
- average(3, 8, 19)
运行结果如下所示:
- 3.0
- 10.0
在使用可变参数时,需要注意以下几点:
1.只有一个可变参数
在一个函数中,可变参数只可以有一个。否则,就会出现错误。如下代码:
- func average(numbers: Double...,aa:Int...){
- …
- }
在一个函数中出现了两个可变参数number和aa,导致程序出现了如下的错误提示信息:
- '...' must be on the last parameter
2.可变参数必须放在最后
可变参数不管在什么时候都必须放在所有参数之后,即作为最后一个参数。否则,就会出现错误,如下代码:
- func average(numbers: Double...,aa:Int){
- …
- }
在此代码中可变参数numbers放在了aa参数之前,导致程序出现了如下的错误信息:
- '...' must be on the last parameter
7.4.6 常量参数和变量参数
在函数中,参数默认都是常量。如果想要改变一个函数参数的值,会引起程序错误。如以下代码:
- func fun(num:Int){
- num=num+1
- println(num)
- }
在此代码中,函数参数num默认是一个常量,而常量的值是不能改变的,所以导致程序出现如下的错误信息
- Cannot assign to 'let' value 'num'
如果想要对参数进行修改,必须要使用一个类似于变量的参数,Swift称之为变量参数。变量参数的定义就是在参数名前使用一个var关键字。以下的代码就是使用了变量参数实现了字符串右对齐的功能。代码如下:
- import Foundation
- func alignRight(var string: String, cou: Int, pad: String) {
- var sc=count(string)
- let amountToPad = cou - sc //获取输入"*"的个数
- //遍历
- for _ in 1...amountToPad {
- string = pad + string
- }
- println(string)
- }
- let originalString1 = "swift"
- alignRight(originalString1, 10, "*")
- let originalString2 = "Hi"
- alignRight(originalString2, 10, "*")
- let originalString3 = ""
- alignRight(originalString3, 10, "*")
运行结果如下所示:
- *****swift
- ********Hi
- **********
注意:变量参数只能存在于函数调用的生命周期中。
7.4.7 输入-输出参数
以上所讲的参数只可以在函数本身内改变。例如以下的代码,想要实现对a和b数值的交换。代码如下本文选自Swift1.2语言快速入门v2.0:
- import Foundation
- func swapTwoInt(var number1: Int, var number2: Int) {
- //实现两个整数的交换
- let temp = number1
- number1 = number2
- number2 = temp
- println("函数体内:a=\(number1)")
- println("函数体内:b=\(number2)")
- }
- var a=2
- var b=3
- println("交换前")
- println("a=\(a)")
- println("b=\(b)")
- println("交换后")
- swapTwoInt(a, b)
- println("a=\(a)")
- println("b=\(b)")
运行结果如下所示:
交换前
- a=2
- b=3
交换后
- 函数体内:a=3
- 函数体内:b=2
- a=2
- b=3
在运行结果中可以看到,a和b的值可在函数本身内实现了交换。如果开发者想用一个函数来修改参数的值,并且想让这些变化在函数调用后仍然有效。这时,需要定义输入-输出参数。它的定义是通过在参数名前加入inout关键字。其语法形式如下:
- func 函数名(inout 参数名: 数据类型, ……) {
- …
- }
输入-输出参数都有一个传递给函数的值,将函数修改后,再从函数返回来替换原来的值。其调用形式如下:
- 函数名(&参数, ……)
其中,参数前面加上&操作符。
【示例7-13】以下的代码使用输入输出参数实现a和b数值的交换功能。代码如下:
- import Foundation
- func swapTwoInt(inout number1: Int, inout number2: Int) {
- //实现两个整数的交换
- let temp = number1
- number1 = number2
- number2 = temp
- }
- var a=2
- var b=3
- println("交换前")
- println("a=\(a)")
- println("b=\(b)")
- println("交换后")
- swapTwoInt(&a, &b)
- println("a=\(a)")
- println("b=\(b)")
运行结果如下:
交换前
- a=2
- b=3
交换后
- a=3
- b=2
注意:如果一个函数的参数是输入-输出参数,在调用时,必须在参数前加一个“&”符号,否则程序就会出现错误。如以下代码,在调用具有输入输出得函数时,在参数前没有添加“&”符号。代码如下:
- import Foundation
- func swapTwoInt(inout number1: Int, inout number2: Int) {
- ……
- }
- var a=2
- var b=3
- ……
- swapTwoInt(a, b)
- ……
由于在函数,调用时没有在参数前添加“&”符号,导致程序出现了以下的错误本文选自Swift1.2语言快速入门v2.0:
- Passing value of type 'Int' to an inout parameter requires explicit '&'
注意:在Swift 1.2中有一个新的属性“@noescape”可以用在函数中,这意味着这个参数是唯一可被调用的(或者用在函数调用时以参数的方式出现),其意思是它的生命周期比函数调用的周期短,这有助于一些小的性能优化本文选自Swift1.2语言快速入门v2.0。