函数内的闭包/需要解释

问题描述 投票:0回答:1

大家!我正在研究闭包,并在书中看到了一个未知(对我来说)在函数中使用闭包的示例:

func counter() -> () -> Int {
   var count = 0
   let incrementer: () -> Int = {
      count += 1
      return count
   }
return incrementer
}

但我从未见过这样的创建闭包的方式。我尝试过通常的一种方法,也很有效:但我从未见过这样一种创建闭包的方法。我尝试了通常的一种方法,也很有效:

func counter() -> Int {
    var count = 0
    let incrementer = { () -> Int in 
        count += 1
        return count
    }
    return incrementer()
}

您能向我解释一下它是如何工作的吗?它只是一个类型注释吗?

swift function syntax closures
1个回答
0
投票

是的,您提供的代码使用闭包的方式乍一看可能有点不寻常,但这是 Swift 中闭包的有效且常见的用法。您在这里看到的是使用类型注释来显式指定闭包的类型,然后从

counter
函数返回该闭包。让我们一步步分解:

  1. func counter() -> () -> Int
    :此函数签名表明
    counter
    函数返回一个不带参数
    () -> Int
    的闭包。换句话说,它返回一个不接受输入并返回整数的函数。

  2. counter
    函数内部,有一个变量
    count
    初始化为 0。这个
    count
    变量由函数内定义的闭包捕获。

  3. let incrementer: () -> Int = { ... }
    :这里定义了一个闭包并将其分配给
    incrementer
    常量。该闭包没有参数 (
    ()
    ) 并返回一个整数 (
    Int
    )。闭包主体递增
    count
    变量并返回其当前值。

  4. 最后,

    incrementer
    闭包从
    counter
    函数返回。因此,当您调用
    counter()
    时,它会返回一个闭包,然后您可以调用该闭包来递增并检索
    count
    的当前值。

您可以像这样使用这个

counter
功能:

let myCounter = counter()
print(myCounter()) // 1
print(myCounter()) // 2
print(myCounter()) // 3

每次调用

myCounter()
时,它都会调用闭包,递增
count
变量,并返回更新后的值。

相比之下,您提供的第二种方法也是有效的,并且达到了相同的结果。它定义了闭包并立即调用它。这只是使用闭包实现相同行为的不同方式。这两种方法之间的选择取决于您的具体用例和编码风格偏好。

© www.soinside.com 2019 - 2024. All rights reserved.