Swift文档翻译计划 -- Function

·  阅读 1088

函数类型

与 OC 不同,Swift 为每个函数都定义了类型,由参数类型和返回值类型组成。例如如下两个函数:

func addTwoInts(_ a: Int, _ b: Int) -> Int {
    return a + b
}
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
    return a * b
}
复制代码

这个例子定义了两个函数,分别接收两个 int 值的参数和返回一个 int 值。这两个函数的类型被定义为 (Int, Int) -> Int,可以理解为:一个函数有两个形参,都是 Int 类型的,并且返回一个 Int 类型的值。对于没有参数或返回值的函数同理:

func printHelloWorld () {
    print(“hello, world”)
}
复制代码

它的类型是 ()-> Void

函数类型的使用

上面例子中的函数在 Swift 中可以赋值给变量:

var mathFunction: (Int, Int) -> Int = addTwoInts
复制代码

根据文档的描述:定义一个名为 mathFunction 的变量,它的类型是一个接受两个 Int 值并返回一个 Int 值的函数,设置这个新变量引用名为 addTwoInts 的函数。, 这样可以直接调用 mathFunction 等同于调用 addTwoInts。

函数作为参数

函数作为参数类似 OC 的 block,在 Swift 中,可以使用上面例子中的函数类型 (Int, Int) -> Int 作为另一个函数的参数类型,将实现留给函数调用方。例子如下:

func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
    print("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// Prints "Result: 8"
复制代码

函数作为返回值

可以通过在有返回值函数的返回箭头 (->) 后面来添加一个函数类型作为另一个函数的返回类型。如下两个函数:

func stepForward(_ input: Int) -> Int {
    return input + 1
}
func stepBackward(_ input: Int) -> Int {
    return input - 1
}
复制代码

他们的函数类型都是 (Int) -> Int,再定义一个 chooseStepFunction(backward:) 函数,让他的返回值类型同样为 (Int) -> Int:

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    return backward ? stepBackward : stepForward
}
复制代码

实际上调用 chooseStepFunction 后会根据 backward 来返回 stepBackward 或 stepForward 函数:

var currentValue = 3
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
print(moveNearerToZero(currentValue))
复制代码

嵌套函数

在函数中再定义函数,称为嵌套函数。理论上函数内部的函数对于外部来说是隐藏的,但它们仍然可以被外部调用。函数内部也可以将嵌套函数返回,让嵌套函数在另一个作用域中使用。 例如上面的例子,可以把 stepForward 和 stepBackward 写在 chooseStepFunction 内成为嵌套函数:

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    func stepForward(input: Int) -> Int { return input + 1 }
    func stepBackward(input: Int) -> Int { return input - 1 }
    return backward ? stepBackward : stepForward
}
复制代码

调用起来和上面是一致的。

参考:Functions

分类:
iOS
标签:
收藏成功!
已添加到「」, 点击更改