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