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

时间:2014-06-10 21:22:58

标签: swift function closures

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

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

triple(1)

5 个答案:

答案 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 }

您可以在关于闭包的官方文档章节中阅读更多相关内容。

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

答案 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的开发者网站:

  

实际上,函数中引入的全局函数和嵌套函数   特殊情况的封闭。闭包采用以下三种形式之一:

     

全局函数是具有名称但不捕获任何名称的闭包   值。嵌套函数是具有名称并且可以捕获的闭包   封闭函数的值。闭包表达式未命名   用轻量级语法编写的闭包,可以从中捕获值   他们周围的环境。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html