此处使用的代码来自Swift Official Document
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementer() -> Int {
runningTotal += amount
return runningTotal
}
return incrementer
}
// what is the different with "var incrementByTen"
let incrementByTen = makeIncrementer(forIncrement: 10)
// why there is a "()" ajacent to the variable name?
incrementByTen()
变量incrementByTen
被赋予makeIncrementer
返回的函数,其参数为10.
问题1。将increemtnByTen
分配给变量而不是常量时的差异是什么?由于这里是不变的,哪一部分是不可改变的?
问题2。为什么括号对"()"在调用时使用变量名称,我知道这可能是函数初始化程序员工。但incrementByTen
是一个常数名称。它是否等于它所指的功能?或者这只是编程语言的一般特征。当你想使用函数类型的变量/常量时,你必须使用"()"连同名字。
答案 0 :(得分:3)
变量incrementByTen被赋值为
这是一切的关键。 incrementByTen
的值是一个函数。
如果incrementByTen
是var
变量,则可以将其重新分配给其他某个函数。由于它是let
变量,因此它是一个常数函数。这与var
类型的let
和Int
变量完全相同。整数值和函数值之间没有很大的区别。他们只是价值观。
括号表示“调用函数”。 incrementByTen
不是调用函数的结果;这是功能本身。这是一个价值。评估该值时,它返回一个函数。然后,您可以使用()
运算符调用该函数。
这完全等同于:
makeIncrementer(forIncrement: 10)()
makeIncrementer(forIncrement: 10)
返回一个函数,()
调用该函数。这类似于:
let x = thingThatReturnsInt()
x + 10
在这种情况下,x
是Int
,我们可以将运算符+
应用于它。 makeIncrementer
恰好返回() -> Int
而不是Int
。
答案 1 :(得分:1)
使用var
也可以正常工作,但除非您需要修改变量,否则它被视为不良做法。
incrementByTen
是() -> Int
类型的函数,因为函数makeIncrementer
会返回另一个函数。
答案 2 :(得分:1)
let incrementByTen = makeIncrementer(forIncrement: 10)
不允许您这样做:incrementByTen = makeIncrementer(forIncrement: 42)
。除非将变量更改为var
,否则无法将新闭包重新分配给变量。
incrementByTen
是一种闭包类型(() -> Int
,具体而言)。 ()
调用闭包没有争论。换句话说,incrementByTen
是闭包本身(打印时将显示"(Function)"
),而incrementByTen()
是通过调用闭包返回的Int
值(将显示{打印时{1}}