当前位置: 代码迷 >> 综合 >> Swift Programming Language--闭包
  详细解决方案

Swift Programming Language--闭包

热度:97   发布时间:2023-12-09 12:18:11.0


"闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。"

在 函数 章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包采取如下三种形式之一:
1. 全局函数是一个有名字但不会捕获任何值的闭包
2. 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包
3. 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的没有名字的闭包
 
Swift的闭包表达式拥有简洁的风格,并鼓励在常见场景中以实现语法优化,主要优化如下:
* 利用上下文推断参数和返回值类型
* 单表达式(single-expression)闭包可以省略 return 关键字
* 参数名称简写
* Trailing 闭包语法



Trailing 闭包
如果您需要将一个很长的闭包表达式作为最后一个参数传递给函数,可以使用 trailing 闭包来增强函数的可读性。
 
Trailing 闭包是一个书写在函数括号之外(之后)的闭包表达式,函数支持将其作为最后一个参数调用。

func someFunctionThatTakesAClosure(closure: () -> ()) { // 函数体部分 
} // 以下是不使用 trailing 闭包进行函数调用 someFunctionThatTakesAClosure({ // 闭包主体部分 
}) // 以下是使用 trailing 闭包进行函数调用 someFunctionThatTakesAClosure() { // 闭包主体部分 
} 

注意:如果函数只需要闭包表达式一个参数,当您使用 trailing 闭包时,您甚至可以把 () 省略掉。



简单的把闭包分为非Trailing 和 Trailing ,

1.非Trailing,是吧闭包主体写在括号里面的

2.Trailing,是把闭包主体是用{}包裹写在括号后面



另外

如果闭包需要传参数,则形式为

{

    (parameters) -> returnType in
    statements


如果,不用参数,则形式为:

{

    //不用 (parameters) -> returnType in

     statements

}

闭包的函数体部分由关键字 in 引入。 该关键字表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始。


闭包(Closures)
Objective-C中的blocks会被自动导入为Swift中的闭包。例如,下面是一个Objective-C 中的block变量:
    //Objective-C void (^completionBlock)(NSData *, NSError *) = ^(NSData *data, NSError *error) {/* ... */} 

而它在Swift中的形式为:
    //Swift let completionBlock: (NSData, NSError) -> Void = {data, error in /* ... */} 

Swift的闭包与Objective-C中的blocks能够兼容,所以你可以把一个Swift闭包传递给一个把block作为参数的Objective-C方法。Swift闭包与函数具有相同的类型,所以你甚至可以传递Swift函数的名字。 闭包与blocks语义上想通,但在一个地方不同:变量是可以直接改变的,但不是像block那样会拷贝变量。换句话说,Swift中变量的默认行为与Objective-C中__block变量一致。



  相关解决方案