💻
ExistOrLive' Gitbook
  • README
  • ReadMe
  • 开发语言学习
    • Python
      • 0.概述
      • 1.基本数据类型
      • 2.变量
      • 3.函数
      • 4.运算符
      • 5.字符串
      • 6.列表
      • 7.元组
      • 8.集合
      • 9.字典
      • 10.流程控制
      • 12.函数
      • 13.模块
      • 14.输入输出格式化
      • 15.面向对象
    • Swift
      • 1.基础部分
        • 常量和变量以及基本类型_1
        • 常量和变量以及基本类型_2
      • 2.基本运算符
        • 基本运算符
      • 3.字符串和字符
        • 字符串
        • 字符串操作
      • 4.集合类型
        • 概述
        • Array
        • Set
        • Dictionary
      • 6.函数
        • 函数
        • 函数返回值
        • 函数类型
      • 7.闭包
        • 闭包
        • 闭包表达式
        • 尾随闭包
        • 捕获变量或常量
        • 闭包是引用类型
        • 逃逸闭包
        • 自动闭包
      • 8.枚举
        • 枚举
        • 枚举与switch语句
      • 9.类和结构体
        • 类和结构体
        • 属性
          • 属性
          • 属性观察器
          • 属性包装器
          • 全局变量和局部变量
          • 类属性
        • 方法
    • Shell
      • Shell变量和基本类型
      • Shell函数
      • Shell基本运算符
      • Shell脚本的参数
      • Shell流程控制
      • Shell输入输出
      • Shell文件包含
  • iOS
    • UI
      • UIKit
        • UIView
          • UIView
          • drawRect
        • UITableView
          • UITableView
          • UITableView的加载过程
  • 学习开发工具
    • 静态分析
      • OCLint
      • infer
      • SwiftLint
    • iOS构建工具
      • fastlane
        • fastlane
        • fastlane的安装
        • fastlane一键打包
        • fastlane证书管理
    • Cocoapods
      • 安装pod库-podfile
      • 创建pod库-podspec
  • 开源库
    • Tool
      • Swiftlint源码学习
      • 利用Swiftlint自定义规则实现自动化code review
由 GitBook 提供支持
在本页
  • 1. 闭包中的类型推断
  • 2. 单表达式闭包的隐式返回
  • 3. 参数名称缩写
  • 4. 运算符方法
  • 5. 总结
  • 不同语言中闭包实现的对比

这有帮助吗?

在GitHub上编辑
  1. 开发语言学习
  2. Swift
  3. 7.闭包

闭包表达式

闭包表达式 是一种构建内联闭包的方式,是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的匿名闭包。

{[capture list](paramList) -> returnType in 
    // closure code
}

闭包表达式由捕获列表,参数列表,返回值,以及闭包函数体组成。

通常捕获列表可以参略,会根据函数体中使用变量或常量自动捕获;

Example

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

// sorted需要的闭包类型 (String,String) -> Bool
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})

1. 闭包中的类型推断

根据闭包需要的类型,可以在闭包定义时省略参数类型和返回类型的定义,根据闭包参数的类型来推断

// 省略参数类型和返回类型,根据(String,String) -> Bool来推断
reversedNames = names.sorted(by: { s1, s2 in
    return s1 > s2
})

2. 单表达式闭包的隐式返回

单行表达式闭包可以通过省略 return 关键字来隐式返回单行表达式的结果

// 省略return,隐式返回
reversedNames = names.sorted(by: { s1, s2 in
    s1 > s2
})

3. 参数名称缩写

Swift 自动为内联闭包提供了参数名称缩写功能,你可以直接通过 $0,$1,$2 来顺序调用闭包的参数.

如果你在闭包表达式中使用参数名称缩写,你可以在闭包定义中省略参数列表,并且对应参数名称缩写的类型会通过函数类型进行推断。in 关键字也同样可以被省略

reversedNames = names.sorted(by: { $0 > $1 } )

4. 运算符方法

实际上还有一种更简短的方式来编写上面例子中的闭包表达式

reversedNames = names.sorted(by: >)

5. 总结

虽然在定义闭包表达式时,有许多简易写法,但是为了保证代码可读性,尽量还是要保证必要的代码存在。

不同语言中闭包实现的对比

闭包 是能够捕获定义上下文中的变量或常量引用的可调用对象。可以在代码中传递和调用。

不同语言中也有相似的实现:

  • C++中lambda表达式

    • lambda表达式支持值捕获和引用捕获

    • 值捕获默认不可以修改,但是将lambda声明为mutable支持修改;引用捕获能够修改取决于是否为常量

    • C++中lambda表达式是值类型

    • 底层实现是重载调用运算符的匿名类的匿名对象;捕获的变量是匿名类的数据成员;函数实现就是重载调用运算符函数

  • OC中的Block

    • Block表达式支持值捕获,和__block捕获

    • 值捕获的值不可以修改;__block捕获可以修改

    • Block是引用类型

    • 底层实现是匿名OC类的匿名对象,函数实现保存在匿名类中的成员函数指针中;捕获的变量是匿名类的属性

  • Swift中的闭包

    • 闭包中都是引用捕获

    • 捕获的值能够修改取决于是否为常量

    • 闭包是引用类型

上一页闭包下一页尾随闭包

最后更新于3年前

这有帮助吗?