如果常量变量是一种函数类型,那么什么不能改变?

时间:2016-06-22 15:34:21

标签: swift function variables types

此处使用的代码来自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是一个常数名称。它是否等于它所指的功能?或者这只是编程语言的一般特征。当你想使用函数类型的变量/常量时,你必须使用"()"连同名字。

3 个答案:

答案 0 :(得分:3)

  

变量incrementByTen被赋值为

这是一切的关键。 incrementByTen的值是一个函数。

如果incrementByTenvar变量,则可以将其重新分配给其他某个函数。由于它是let变量,因此它是一个常数函数。这与var类型的letInt变量完全相同。整数值和函数值之间没有很大的区别。他们只是价值观。

括号表示“调用函数”。 incrementByTen不是调用函数的结果;这是功能本身。这是一个价值。评估该值时,它返回一个函数。然后,您可以使用()运算符调用该函数。

这完全等同于:

makeIncrementer(forIncrement: 10)()

makeIncrementer(forIncrement: 10)返回一个函数,()调用该函数。这类似于:

let x = thingThatReturnsInt()
x + 10

在这种情况下,xInt,我们可以将运算符+应用于它。 makeIncrementer恰好返回() -> Int而不是Int

答案 1 :(得分:1)

  1. 使用var也可以正常工作,但除非您需要修改变量,否则它被视为不良做法。

  2. incrementByTen() -> Int类型的函数,因为函数makeIncrementer会返回另一个函数。

答案 2 :(得分:1)

  1. let incrementByTen = makeIncrementer(forIncrement: 10)不允许您这样做:incrementByTen = makeIncrementer(forIncrement: 42)。除非将变量更改为var,否则无法将新闭包重新分配给变量。

  2. incrementByTen是一种闭包类型(() -> Int,具体而言)。 ()调用闭包没有争论。换句话说,incrementByTen是闭包本身(打印时将显示"(Function)"),而incrementByTen()是通过调用闭包返回的Int值(将显示{打印时{1}}