Default Parameter Values (参数默认值)
在定义函数的时候,你可以给任何参数定义一个默认的值,如果定义了默认值,在调用这个函数的时候,你可以忽略这个参数.
注意:
设置参数默认值的时候,需要按照函数的参数列表最后的开始,这可以确保在调用函数的时候,即使没默认值的参数也可以按顺序的对应上,也使得函数在调用的时候更加清晰.
下面的代码例子是join函数的新版本,它使用了默认参数:
func join(string s1: String, toString s2: String,
withJoiner joiner: String = " ") -> String {
return s1 + joiner + s2
}
如果在调用joiner函数的时候,设置了一个string的默认值,那么这个值可以与另外一个字符串拼接在一起:
join(string: "hello", toString: "world", withJoiner: "-")
// returns "hello-world”
但是如果调用joiner的时候没有设置默认值,系统将会使用一个空格代替:
join(string: "hello", toString: "world")
// returns "hello world”
External Names for Parameters with Default Values (默认值的扩展名)
在多少情况下,对参数使用默认值的时候都需要提供扩展名.这样可以明确参数的意义,尤其是在调用函数的时候.
为了方便,在你没有提供扩展名的时候,Swift提供了自动扩展名给定义的默认参数.这个自动扩展名与局部参数名相同,就好像你写了一个#号在局部变量的前面.
下面是join函数的的一个版本,它没有提供参数的扩展名,但提供了默认值:
func join(s1: String, s2: String, joiner: String = " ") -> String {
return s1 + joiner + s2
}
在这种情况下,Swift自动的提供了一个扩展的参数名给有默认值的参数.因此在调用函数的时候,必须提供扩展名的参数,这使得函数的参数更加清楚和没有歧义:
join("hello", "world", joiner: "-")
// returns "hello-world”
Variadic Parameters (可变参数)
一个可变参数可以接收某种类型的0个或者多个值.在调用函数的时候,你可以使用可变参数来指定传递给函数的参数个数.可变参数的写法是在参数类型名的前面插入三个点字符 (...).
传递给可变参数的值可以在函数体内作为类似数组的类型使用.例如:
func arithmeticMean(numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
// returns 3.0, which is the arithmetic mean of these five numbers
arithmeticMean(3, 8, 19)
// returns 10.0, which is the arithmetic mean of these three numbers
注意:
一个函数最多只能有一个可变参数,并且必须在参数列表的最后面,这是为了避免在调用多个参数的函数的时候有歧义.
如果你定义函数的有一个或者多个参数有默认值,也可以使用可变参数,只是要将它放在所有默认参数的最后面.
Constant and Variable Parameters (参数常量和参数变量)
函数参数默认是常量,在函数内部试图修改一个函数的参数值都会产生一个编译错误.这就意味着你不能修改函数的参数.
然而,有时候一个参数值的可变拷贝对函数是非常有用的,这样你可以避免在定义一个新的变了在函数体内部.参数变量可以像使用变量而不是常量的方式来处理,并给它复制一个参数 值的新拷贝.
定义参数变量是在参数名前面使用前缀的关键字:var
func alignRight(var string: String, count: Int, pad: Character) -> String {
let amountToPad = count - countElements(string)
for _ in 1...amountToPad {
string = pad + string
}
return string
}
let originalString = "hello"
let paddedString = alignRight(originalString, 10, "-")
// paddedString is equal to "-----hello"
// originalString is still equal to "hello”
这个例子定义了一个叫做alignRight的新函数,它将输入的字符串进行右对齐,在这个例子里,字符串‘hello’被转换为’-----hello’.
函数alignRight定义了参数变量string,这意味着string是可变的局部变量,可以使用传递的字符串值进行初始化,也可以在函数体内进行修改使用.
这个函数一开始先计算出有多少个字符需要添加到string的左边来达到右对齐的效果.这个值被存储在局部常量amountToPad中,然后函数添加amountToPad个数量的短横线字符在 string的左边,最后返回结果.
注意:
可修改的参数变量作用范围不能超过函数的末尾,并且对于函数之外,它们是不可见的.参数变量的生命期只存在于函数的调用周期.
//******待续...*******//