首页 > 代码库 > Welcome to Swift (苹果官方Swift文档初译与注解三十三)---235~240页(第五章-- 函数)

Welcome to Swift (苹果官方Swift文档初译与注解三十三)---235~240页(第五章-- 函数)

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的左边,最后返回结果.

  注意:

  可修改的参数变量作用范围不能超过函数的末尾,并且对于函数之外,它们是不可见的.参数变量的生命期只存在于函数的调用周期.

 //******待续...*******//