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

Functions with Multiple Return Values (多个返回值的函数)

  可以使用元组类型作为函数的返回值类型,这样可以将多个返回值组成一个复合值来返回.

  下面的例子定义了一个叫做count的函数来计算字符串里的字符(元音,辅音和其它字符数量):

    func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {

        var vowels = 0, consonants = 0, others = 0

        for character in string {

            switch String(character).lowercaseString {

            case "a", "e", "i", "o", "u":

                ++vowels

            case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",

            "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":

                ++consonants

            default:

                ++others

            }

        }

        return (vowels, consonants, others)

    }

  你可以使用这个count函数计算一个随机字符串的字符个数:

    let total = count("some arbitrary string!")

    println("(total.vowels) vowels and (total.consonants) consonants")

    // prints "6 vowels and 13 consonants”

  注意,函数返回的元组中,元素不需要再命名,因为元素的名字已经是函数返回类型的一部分了.

Function Parameter Names (函数参数命名)

  前面所有的函数定义了它们的参数名字:

    func someFunction(parameterName: Int) {

        // function body goes here, and can use parameterName

        // to refer to the argument value for that parameter

    }

  然而,这戏参数名称只用在函数体内部,并且在调用函数的时候不能使用它们.这种方式命名的参数被称为局部参数命名,因为它们只在函数体内部可见.

External Parameter Names (扩展参数命名)

  有时候在调用函数时,命名每个参数是非常有用的,这样可以表明每个你要传递给函数的参数目的.

  如果你希望在函数调用的时候,使用你函数的用户能提供参数的名称,你可以给每个参数定义一个扩展参数名,为了区别于局部参数名,你要将扩展名写在局部参数名前,并使用空格分   隔:

    func someFunction(externalParameterName localParameterName: Int) {

        // function body goes here, and can use localParameterName

        // to refer to the argument value for that parameter

    }

  注意点:

  如果你使用了参数的扩展命名,那么在调用函数的时候必须都要使用扩展的名字.

  看看下面的例子,思考一下这个函数:

    func join(s1: String, s2: String, joiner: String) -> String {

        return s1 + joiner + s2    

    }

  当你调用这个函数的时候,你传递给函数的三个参数的目的是不清楚的:

    join("hello", "world", ", ")

    // returns "hello, world”

  为了让String的值更明确,定义扩展名给函数里的每个参数:

    func join(string s1: String, toString s2: String, withJoiner joiner: String)

        -> String {

            return s1 + joiner + s2

    }

  在这个join函数里,第一个参有个String的扩展名和一个局部名s1;第二个参数有个toString扩展名和一个局部名s2;第三个参数的扩展名是withJoiner,局部名为joiner.

  现在你可以使用这些扩展名称来调用这个函数,会非常清楚且没有歧义:

    join(string: "hello", toString: "world", withJoiner: ", ")

    // returns "hello, world

  使用扩展命名方式可以使得这个函数在调用的时候更加明白,并且函数体也更具有可读性.

  注意点:

  如果你的代码在被别人第一次阅读的时候,请考虑是否使用函数的参数扩展命名方式,如果每个参数的目的都非常明确,也没有起义,那么可以不需要使用扩展名.

Shorthand External Parameter Names 扩展命名缩写

  如果你想给函数的参数进行扩面命名,但局部参数命名以及有了相近的名称,你就没有必要写两遍,相反,你只写一遍,然后在名字前面使用一个#符号.这会告知Swift使用这个名字既是  扩展名也是局部参数名.

  下面的例子定义了一个函数containsCharacter:

    func containsCharacter(#string: String, #characterToFind: Character) -> Bool {

        for character in string {

            if character == characterToFind {

                return true

            }

        }

        return false

    }

  这个函数的参数名在选择上清洗,并在函数体内具有可读性,同时也使得函数在调用的时候没有歧义性:

    let containsAVee = containsCharacter(string: "aardvark", characterToFind: "v")

    // containsAVee equals true, because "aardvark" contains a "v”

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

原文地址:https://www.cnblogs.com/caios/p/3843431.html