• Swift开发基础06-闭包


    Swift的闭包(Closures)是一种将功能块和上下文整合并演示在代码中的一种手段。闭包可以捕获并存储其上下文中的变量和常量。与普遍存在于其他语言的匿名函数(如Python的lambda、JavaScript的函数表达式)类似,Swift的闭包提供了强大的功能,并在很多场景中替代了函数。

    闭包有三种主要形式:

    1. 全局函数:有名字但不捕获任何值。
    2. 嵌套函数:有名字并能捕获其封闭函数内的值。
    3. 闭包表达式:无名字,可以从其上下文中捕获值。

    闭包表达式语法

    闭包表达式语法是构建闭包的一种方式,包含一个参数列表,一个返回类型和闭包的主体:

     
    { (parameters) -> returnType in
        statements
    }
    

    让我们一步步通过示例探讨一下闭包的使用情形。

    示例:最基本的闭包

     
    let simpleClosure = {
        print("Hello, Swift Closure!")
    }
    
    simpleClosure() // 输出: "Hello, Swift Closure!"
    

    示例:带参数和返回值的闭包

     
    let sumClosure = { (a: Int, b: Int) -> Int in
        return a + b
    }
    
    let result = sumClosure(3, 5)
    print(result) // 输出: 8
    

    示例:作为参数传递闭包

    闭包经常作为参数传递给函数,比如用作回调函数。

     
    func performOperation(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int {
        return operation(a, b)
    }
    
    let result = performOperation(a: 10, b: 20, operation: { (x, y) -> Int in
        return x * y
    })
    print(result) // 输出: 200
    

    示例:尾随闭包

    如果闭包是函数的最后一个参数,那么可以使用尾随闭包的语法来书写:

     
    func performOperation(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int {
        return operation(a, b)
    }
    
    let result = performOperation(a: 10, b: 20) { (x, y) -> Int in
        return x * y
    }
    print(result) // 输出: 200
    

    示例:闭包捕获值

    闭包可以捕获并存储其上下文中的变量值,这被称为“捕获”。

     
    func makeIncrementer(incrementAmount: Int) -> () -> Int {
        var total = 0
        
        let incrementer: () -> Int = {
            total += incrementAmount
            return total
        }
        
        return incrementer
    }
    
    let incrementByTwo = makeIncrementer(incrementAmount: 2)
    
    print(incrementByTwo()) // 输出: 2
    print(incrementByTwo()) // 输出: 4
    

    示例:自动闭包

    自动闭包是一种自动捕获表达式的闭包,多用于延时计算和副作用控制。

    swift
    复制代码
    var array = [1, 2, 3]
    
    func removeFirstElement(array: @autoclosure () -> Int?) -> Int? {
        return array()
    }
    
    let firstElement = removeFirstElement(array: array.removeFirst())
    print(firstElement ?? "Array is empty") // 输出: 1
    

    示例:逃逸闭包(Escaping Closures)

    当闭包在函数返回之后还被调用时,需要将其标记为@escaping

    swift
    复制代码
    var completionHandlers: [() -> Void] = []
    
    func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
        completionHandlers.append(completionHandler)
    }
    
    someFunctionWithEscapingClosure {
        print("This is an escaping closure")
    }
    
    // 代码稍后执行
    completionHandlers.first?() // 输出: "This is an escaping closure"
    

    这些示例涵盖了Swift闭包的基础和一些高级场景。

  • 相关阅读:
    Github每日精选(第66期):擦图老照片修复神器--Lama Cleaner
    WPF学习笔记-FlowDocument流文档基础知识和基本操作
    nacos配置中心使用教程
    进程的状态
    OpenCV C++ 图像处理实战 ——《基于NCC多角度多目标匹配》
    Angular+html+js前端加载生命周期
    深度学习资源列表
    一文精通C++ -- 继承
    面试基础题【1】--排序算法
    『航班乘客满意度』场景数据分析建模与业务归因解释 ⛵
  • 原文地址:https://www.cnblogs.com/chglog/p/18051447