创建一个返回函数的函数的目的是什么?

时间:2017-11-22 04:55:01

标签: swift

我正在阅读Apple doc about swift。 它有一个例子,它创建了一个返回函数的函数

func makeIncrementer() -> ((Int) -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7)

所以我在这里关注的是这种做法的优点以及何时使用它?

如果有人也可以帮助我理解"一个函数可以将另一个函数作为其参数之一。"那将是如此友善

提前致谢

3 个答案:

答案 0 :(得分:1)

这是一个非常常见的情况,你一直都在使用,可能没有意识到。

实例方法实际上只是返回闭包的类方法。

String.hasPrefix为例,其类型为(String) -> (String) -> Bool

所以String.hasPrefix接受String参数,这是实例方法将要处理的实例,并返回类型(String) -> Bool的闭包。

我们通常会使用类似"The quick brown fox".hasPrefix的形式来获得此闭包,但我们也可以使用String.hasPrefix("快速棕色狐狸"),这是等效的。

这些表达式的结果是hasPrefix函数,它绑定到它将作用的特定实例(字符串"The quick brown fox")。

然后我们可以使用另一个String参数调用此闭包,该参数告诉它要查找的前缀。

以下是您通常会写的内容:

let result = "The quick brown fox".hasPrefix("The") // => True

让我们将其分解为多个步骤(添加了类型注释以强调游戏类型):

import Foundation

let instance: String = "The quick brown fox"
let desiredPrefx: String = "The"

let staticMethod: (String) -> (String) -> Bool = String.hasPrefix
let boundInstanceMethod: (String) -> Bool = staticMethod(instance)
let result: Bool = boundInstanceMethod(desiredPrefx) // => true

当量:

import Foundation

let instance: String = "The quick brown fox"
let desiredPrefx: String = "The"

let boundInstanceMethod: (String) -> (String) -> Bool = instance.hasPrefix
let result: Bool = boundInstanceMethod(desiredPrefx) // => true

答案 1 :(得分:0)

创建返回函数的函数的好处是内部函数会记住它在其中创建的环境。通常,当您调用函数时,该函数中的变量在函数完成时结束。但是,通过返回一个函数,您可以创建一个所谓的闭包,这使您可以保持创建闭包的环境,这样您就可以反复使用它。

能够接受函数作为另一个函数的参数有很多好处。例如,您可以创建一个过滤函数,该函数接受一个数组作为其第一个参数,另一个函数作为其第二个参数。然后,您可以调用您的过滤器函数并向其传递一个函数,该函数将检查数组的每个元素以查看它是否为偶数,并返回仅包含偶数值的新数组。您还可以使用一个函数调用相同的过滤器函数,该函数检查数组的每个元素以查看它是否为奇数,并返回仅包含奇数的新数组。这使得过滤器功能比其他方式更灵活,并且允许您减少编写更少的代码。每次想要过滤数组元素并且必须维护大量过滤函数时,您不必编写新的复杂函数,而只需编写一个。

我希望这会有所帮助。

答案 2 :(得分:0)

makeIncrementer()有一个函数addOne(number: Int) 这只能在makeIncrementer()中找到 在makeIncrementer()的外面,我们无法访问addOne(number: Int)