我正在尝试自学编写Swift中的代码,但是我很难将我正在阅读的东西翻译成类似于英语的东西。这是一个例子:
func createAdder(numberToAdd: Int) -> (Int) -> Int
{
func adder(number: Int) -> Int
{
return numberToAdd + number
}
return adder
}
var addTwo = createAdder(2)
addTwo(4)
如何阅读第一行代码并解释如何执行此函数?
答案 0 :(得分:3)
createAdder
是一个返回函数的函数。括号的位置有点令人反感 - 这样更有意义:
func createAdder(numberToAdd: Int) -> (Int -> Int)
因此它返回类型为Int -> Int
的函数。那是什么意思?看看这个功能:
func addTwo(n: Int) -> Int {
return n + 2
}
该函数采用整数 - n
- 并返回另一个整数。所以函数的类型是:
Int -> Int
在这种情况下,这个函数只会增加两个给它。但是说你想要概括(在这个人为的例子中没有多大意义,但这种事情在其他场景中非常强大)。假设您想拥有一堆函数,每个函数都会为给定的数字添加一个数字。要做那个,你需要写一些类似你在你的例子中写的东西:
func createAdder(numberToAdd: Int) -> (Int) -> Int
{
func adder(number: Int) -> Int
{
return numberToAdd + number
}
return adder
}
createAdder
函数接受一个数字,然后定义一个新函数 - adder
- 它返回。
可能令人困惑的最后一点是行
var addTwo = createAdder(2)
通常,您使用单词func
定义函数。但是,这只是语法。函数是变量,就像Swift中的其他类型一样,它们可以这样处理。这就是为什么你能够返回一个函数,这就是为什么你能够使用var
来分配它。
那它是做什么用的?好吧,如果你打电话给createAdder(2)
,你得到的相当于
func addTwo(n: Int) -> Int {
return n + 2
}
如果你做了类似的事情:
var addThree = createAdder(3)
这相当于:
func addThree(n: Int) -> Int {
return n + 3
}
在这两种情况下,你都会像普通函数一样使用它们:
addThree(1) // returns 4
所以我说这个例子有点做作 - 而且是 - 所以这种事情在哪里有用?通常,采用或返回函数的函数称为“高阶”函数。它们大量有用,如果你沿着函数式编程路线走下去,它们可以很快变得非常强大和有点哲学。保持它的基础,大多数人在Swift中遇到它的第一个地方是函数.map()
。 map()
是一个高阶函数 - 它以一个函数作为参数。但是,它还需要其他东西 - 在这个例子中,它将是一个数组。它的作用是将它给予的函数应用于数组的每个元素。所以,让我们使用createAdder()
为我们提供一个函数,为函数添加1:
let addOne = createAdder(1)
是的,那么让我们得到一系列其他数字:
let nums = [1, 2, 3, 4]
然后,让我们将其与map
:
let mapped = nums.map(addOne) // [2, 3, 4, 5]
如您所见,这是处理和管理数组的一种非常强大的方法。有很多这样的函数 - filter()
,flatMap()
,reduce()
- 它们都依赖于这个概念。
答案 1 :(得分:1)
它描述:声明一个名为“createAdder”的函数,它以Int作为参数,此函数返回一个函数,它本身将一个Int作为参数;而这个函数本身,从“createAdder”返回的内容,返回一个Int。
-> (Int) -> Int
表示“返回一个函数 - 获取一个Int-将返回一个Int”。
答案 2 :(得分:0)
第一行代码为:
一个函数createAdder
,它将numberToAdd
类型Integer
作为参数,而返回一个接收Integer
作为参数的函数并返回Integer
。在这种情况下,返回的函数是在adder
中创建的createAdder
函数。