zoukankan      html  css  js  c++  java
  • 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”

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

  • 相关阅读:
    redis在Linux的下载和安装
    redis 安装启动及设置密码windows
    Lambda学习---方法引用和其他基本应用
    Lambda学习---StreamApi使用
    java对象的访问定位
    java对象是如何创建的
    通过“减少内存”的方式解决内存溢出的问题
    springmvc配置中,mapper一直依赖注入不进去的问题记录
    为什么要简化代码书写
    压力测试工具
  • 原文地址:https://www.cnblogs.com/caios/p/3843431.html
Copyright © 2011-2022 走看看