• 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”

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

  • 相关阅读:
    转:SVN常见问题与解决方法
    Mac OS 下的解压缩软件——The Unarchiver
    Django报错 The serializer field might be named incorrectly and not match any Got AttributeError when attempting to get a value for field `author_for` on serializer `KnownledgeBaseListSerializer`
    Django 生成数据库表时的报错TypeError: __init__() missing 1 required positional argument: 'on_delete'
    webstorm不能中文输入问题
    npm报错This is probably not a problem with npm. There is likely additional logging
    Django 报错no sucn column: OpretionalError
    Python 报错 AttributeError: module 'django.db.models' has no attribute 'SubfieldBase'
    详解Django中Request对象的相关用法
    Python中import, from...import,import...as的区别
  • 原文地址:https://www.cnblogs.com/caios/p/3843431.html
Copyright © 2020-2023  润新知