Swift:函数与闭包的定义和语法

Rud*_*ger 8 closures function swift

这是一个函数还是一个闭包?

let triple: Int -> Int = {
    (number: Int) in // What is this?
    let result = 3 * number
    number
    return result
}

triple(1)
Run Code Online (Sandbox Code Playgroud)

Mic*_*lum 10

1:这是一个关闭.

例子:

func aFunction() -> () {
    // do something
}

let aClosure:() -> () = {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

函数实际上是闭包的特例.您可以使用大括号({})来编写没有名称的闭包.用于将参数和返回类型与正文分开.

摘录自:Apple Inc."The Swift Programming Language."iBooks.https://itun.es/us/jEUH0.l

2:"in"只是选择用于表示参数/返回类型结束的位置,以及闭包的主体开始的符号.它与inout无关.

  • 为什么我使用函数而不使用闭包或相反?真正的区别是什么? (2认同)

hal*_*ski 6

这将闭包绑定到常量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 }
Run Code Online (Sandbox Code Playgroud)

您可以在关于闭包的官方文档章节中阅读更多相关信息.

https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Closures.html

  • 将闭包绑定到变量类似于但不是**与将其声明为函数相同.重要差异的三个示例包括重载,默认参数值和泛型,绑定闭包都不能支持. (3认同)

Con*_*lor 5

快速关闭的定义如下:

{ (parameters) -> return type in
    statements
}
Run Code Online (Sandbox Code Playgroud)

因此,根据定义,您的代码示例被视为闭包。但是,我将通过在花括号内移动返回类型来重写它,如下所示:

let triple = {
  (number: Int) -> Int in
  let result = 3 * number  
  number
  return result
}

triple(1)
Run Code Online (Sandbox Code Playgroud)

参数和返回类型在打开花括号之后开始,在in关键字之前结束,而闭包主体在in关键字之后开始,并在关闭花括号处结束。接下来,我建议从iTunes下载和阅读iBook,可以在以下位置找到该书:

https://itunes.apple.com/cn/book/swift-programming-language/id881256329?mt=11