大家!我正在研究闭包,并在书中看到了一个未知(对我来说)在函数中使用闭包的示例:
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 中闭包的有效且常见的用法。您在这里看到的是使用类型注释来显式指定闭包的类型,然后从
counter
函数返回该闭包。让我们一步步分解:
func counter() -> () -> Int
:此函数签名表明 counter
函数返回一个不带参数 () -> Int
的闭包。换句话说,它返回一个不接受输入并返回整数的函数。
在
counter
函数内部,有一个变量 count
初始化为 0。这个 count
变量由函数内定义的闭包捕获。
let incrementer: () -> Int = { ... }
:这里定义了一个闭包并将其分配给incrementer
常量。该闭包没有参数 (()
) 并返回一个整数 (Int
)。闭包主体递增 count
变量并返回其当前值。
最后,
incrementer
闭包从counter
函数返回。因此,当您调用 counter()
时,它会返回一个闭包,然后您可以调用该闭包来递增并检索 count
的当前值。
您可以像这样使用这个
counter
功能:
let myCounter = counter()
print(myCounter()) // 1
print(myCounter()) // 2
print(myCounter()) // 3
每次调用
myCounter()
时,它都会调用闭包,递增 count
变量,并返回更新后的值。
相比之下,您提供的第二种方法也是有效的,并且达到了相同的结果。它定义了闭包并立即调用它。这只是使用闭包实现相同行为的不同方式。这两种方法之间的选择取决于您的具体用例和编码风格偏好。