zoukankan      html  css  js  c++  java
  • Welcome to Swift (苹果官方Swift文档初译与注解三十四)---241~247页(第五章-- 函数)

    In-Out Parameters (全局参数)

      像前面描述的参数变量,只能在函数体内进行修改,如果你需要函数修改的它的参数值,并且希望这些改变在函数调用结束后仍然有效,可以定义使用全局参数.

      定义全局参数使用关键字inout,全局参数的值在函数调用的时候进行传递,在函数体内进行修改,最后函数回传新值来替换之前的值.

      全局参数在函数中,只能使用变量来当作参数,不能使用常量或者文本值作为参数.因为常量或者文本值不可以被修改.为了表明参数变量可以被修改,要在变量名的前面直接添加一个&  符号.

      注意

      全局参数不能有默认值,可变参数不可以被当作全局参数来使用.如果你标记了参数为inout,你就不能再使用var或者let标记它们.

      下面演示一个swapTwoInts函数,它有两个全局参数a和b:

        func swapTwoInts(inout a: Int, inout b: Int) {

            let temporaryA = a

            a = b

            b = temporaryA

        }

      这个swapTwoInts函数只是简单的交换b和a的值,函数通过先存储a的值到一个临时常量temporaryA中,然后将b赋值给a,接着再将temporaryA赋值给b.

      你可以使用两个Int类型的变量来调用swapTwoInts函数,这可以交换它们的值,注意,在someInt和anotherInt的前面使用了&符号:

        var someInt = 3

        var anotherInt = 107

        swapTwoInts(&someInt, &anotherInt)

        println("someInt is now (someInt), and anotherInt is now (anotherInt)")

        // prints "someInt is now 107, and anotherInt is now 3

      上面的例子演示了在函数swapTwoInts内部修改了someInt和anotherInt的初值,即便它们是定义在函数体之外的.

      注意

      全局参数与函数的返回值是不同的.上面的例子中swapTwoInts函数没有定义返回值,但是它仍然修改了someInt和anotherInt的值.全局参数是函数可以影响到函数体之外的一种变通  方式.

    Function Types (函数类型)

      每个函数都会有一个特定的类型,它由参数类型和返回值类型组成.

      例如:

        func addTwoInts(a: Int, b: Int) -> Int {

            return a + b

        }

        func multiplyTwoInts(a: Int, b: Int) -> Int {

            return a * b

        }

      这个列子定义了两个简单的数学函数,叫做addTwoInts和multiplyTwoInts.每个函数都有两个Int值,并且返回一个Int值,它们的执行结果都是相似的数学操作.

      这两个函数的类型是 (Int, Int) -> Int.

      这可以被解释为:”函数的类型是,有两个参数,它们都是Int类型,并且它会返回一个Int类型的值”

      下面是一个函数,它没有参数或返回值:

        func printHelloWorld() {

            println("hello, world")

        }

      这个函数的类型是 () -> ().它的意思是”这个函数没有参数,它返回Void”.没有指定返回值的函数总是会返回Void,Void在Swfit中等于空,写作().

    Using Function Types (函数类型的使用)

      使用函数的类型,就像在Swift中使用其他类型一样.例如,你可以定义一个常量或者变量来作为函数的类型,并赋值相应函数中的变量:

        var mathFunction: (Int, Int) -> Int = addTwoInts

      这段代码可以读为:

      ”定义一个叫做mathFunction的变量,它有一个函数的类型,这个函数带两个Int值,并返回一个Int值,设置这个变量需要引用叫做addTwoInts的函数.”

      函数addTwoInts的类型与变量mathFunction是相同的.因此这样的赋值是可以通过Swift的类型检查.

      你现在可以使用mathFunction来调用函数:

        println("Result: (mathFunction(2, 3))")

        // prints "Result: 5”

      可以使用同样的方式来给同一个变量赋值不同的函数,只要函数的类型与变量匹配:

        mathFunction = multiplyTwoInts

        println("Result: (mathFunction(2, 3))")

        // prints "Result: 6”

      对于其他的类型,你可以在赋值一个常量或者变量的时候,使用Swift自动函数类型检查:

        let anotherMathFunction = addTwoInts

        // anotherMathFunction is inferred to be of type (Int, Int) -> Int

    Function Types as Parameter Types (函数类型作为参数类型)

      你可以使用函数类型来作为参数类型,给另一个函数使用.这可以让函数在调用的时候,可以使得函数调用者自己实现函数的一部分效果.

      例子:

        func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {

            println("Result: (mathFunction(a, b))")

        }

        printMathResult(addTwoInts, 3, 5)

        // prints "Result: 8”

      这个例子定义了一个叫做printMathResult的函数,它有三个参数,第一个参数叫做mathFunction,它的类型是(Int, Int) -> Int,你可以传递这种类型的任意函数作为第一个参数.第二参  数和第三个参数叫做a和b,它们都是Int类型,它们被用来作为math函数的输入值.

      当调用printMathResult的时候,传递addTwoInts函数给它,以及整数值3和5,它会调用使用3和5来调用提供的函数(addTwoInts),并且输出结果8.

      printMathResult的作用是输出mathFunction的调用结果,而不用理会这个函数实际的执行过程,它只关注这个函数的正确类型.这使得printMathResult能放出一些功能个给函数的调  用者,并且是类型安全的方式进行的.

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

  • 相关阅读:
    JVM运行时数据区及对象在内存中初始化的过程
    一文搞懂List 、List<Object>、List<?>的区别以及<? extends T>与<? super T>的区别
    Java中创建泛型数组
    JavaBean详解
    Java常用命令及参数
    一文彻底搞懂Java中的环境变量
    类型信息
    java中的数组
    URL与URI的区别
    上行速率和下行速率
  • 原文地址:https://www.cnblogs.com/caios/p/3851850.html
Copyright © 2011-2022 走看看