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能放出一些功能个给函数的调  用者,并且是类型安全的方式进行的.

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

Welcome to Swift (苹果官方Swift文档初译与注解三十四)---241~247页(第五章-- 函数),布布扣,bubuko.com

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

上一篇:实验4:开源控制器实践——OpenDaylight


下一篇:windows上visual studio 2019配置libtorch