这是一个函数还是一个闭包?
let triple: Int -> Int = {
(number: Int) in // What is this?
let result = 3 * number
number
return result
}
triple(1)
答案 0 :(得分:9)
1:这是一个关闭。
示例:
func aFunction() -> () {
// do something
}
let aClosure:() -> () = {
// do something
}
函数实际上是闭包的一个特例。你可以写一个 带有大括号({})的周围代码没有名称的闭包。用于 将参数和返回类型与正文分开。
摘自:Apple Inc.“The Swift Programming Language。”iBooks。 https://itun.es/us/jEUH0.l
2:“in”只是选择表示参数/返回类型结束的位置,以及闭包的主体开始的符号。它与inout无关。
答案 1 :(得分:5)
将闭包绑定到常量triple
,如果在全局范围内完成,则类似于将其声明为函数(请参阅下面的Eric对差异的评论)。 (number: Int) in
行声明了闭包的输入参数。
在这种情况下,类型可以省略,因为它可以从闭包类型中推断出来,因为它只有一个语句,所以它可以写成一个隐式返回的闭包表达式:
let triple: Int -> Int = { number in
3 * number
}
// or as a function
func triple(number: Int) -> Int {
return 3 * number
}
// Or as the very short
let triple: Int -> Int = { 3 * $0 }
您可以在关于闭包的官方文档章节中阅读更多相关内容。
答案 2 :(得分:4)
Swift Closures定义如下:
{ (parameters) -> return type in
statements
}
因此,根据定义,您的代码示例被视为闭包。但是,我会通过在大括号内移动返回类型来重写它:
let triple = {
(number: Int) -> Int in
let result = 3 * number
number
return result
}
triple(1)
参数和返回类型在开始大括号之后开始,在in关键字之前结束,并且闭包的主体在in关键字之后开始,并在结束大括号结束。接下来,我建议从iTunes下载和阅读iBook,可以在以下位置找到:
https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11
答案 3 :(得分:3)
区分函数和闭包的简单方法是
全球功能:拥有名称。不要捕获任何值。
嵌套功能:拥有名称。从封闭函数中捕获值。
关闭:没有名称之类的功能。从相邻块中捕获值。
答案 4 :(得分:3)
函数是一个具有名称的闭包。你提供的闭包有一个名字,因此既是函数又是闭包。
来自Apple的开发者网站:
实际上,函数中引入的全局函数和嵌套函数 特殊情况的封闭。闭包采用以下三种形式之一:
全局函数是具有名称但不捕获任何名称的闭包 值。嵌套函数是具有名称并且可以捕获的闭包 封闭函数的值。闭包表达式未命名 用轻量级语法编写的闭包,可以从中捕获值 他们周围的环境。