美文网首页
闭包和闭包表达式

闭包和闭包表达式

作者: 一个栗 | 来源:发表于2021-09-05 15:23 被阅读0次

    闭包的概念

    • 全局和内嵌函数,实际上是特殊的闭包。闭包符合如下3种形式中的一种:
    1. 全局函数是一个有名字但不会捕获任何值的闭包;
    2. 内嵌函数是一个有名字且能从其上层函数捕获值的闭包;
    3. 闭包表达式是一个轻量级语法所写的可以捕获其上下文中常量或变量值的没有名字的闭包。

    闭包表达式

    • 闭包表达式是一种在简短行内就能写完闭包的语法。

    闭包表达式 -- 从 sorted 函数说起

    • Swift 的标准库提供了一个叫做 sorted(by:) 的方法,会根据你提供的排序闭包将已知类型的数组的值进行排序。一旦它排序完成,sorted(by:) 方法会返回与原数组类型大小完全相同的一个新数组,该数组的元素是已排序好的。原始数组不会被 sorted(by:) 方法修改。
    let names = ["zhangsan", "lisi", "wangwu", "zhaoliu"]
    func backward(_ s1: String, _ s2: String) -> Bool {
        return s1 > s2
    }
    var reversedNames = names.sorted(by: backward)
    print(reversedNames)
    
    执行结果如下:
    ["zhaoliu", "zhangsan", "wangwu", "lisi"]
    

    闭包表达式语法

    • 闭包表达式语法能够使用常量形式参数、变量形式参数和输入输出形式参数,但不能提供默认值。可变形式参数也能使用,但需要在形式参数列表的最后面使用。元祖也可被用来作为形式参数和返回类型。

    闭包表达式语法版本的 backward

    • 将之前 backward(::) 函数改为闭包表达式版本
    let names = ["zhangsan", "lisi", "wangwu", "zhaoliu"]
    var reversedNames = names.sorted(by: { (s1 : String , s2 : String) -> Bool in
        return s1 > s2
    })
    print(reversedNames)
    
    执行结果如下:
    ["zhaoliu", "zhangsan", "wangwu", "lisi"]
    

    从语境中推断类型

    • 因排序闭包为实际参数来传递给函数,故 Swift 能推断它的形式参数类型和返回类型
    • sorted(by:) 方法期望它的形式参数是一个(String, String) -> BOOL 类型的函数,这意味着 (String, String) 和 BOOL 类型不需要被写成闭包表达式定义中的一部分,因为所有的类型都能被推断,返回箭头(->)和围绕在形式参数名周围的括号也能被省略。
    let names = ["zhangsan", "lisi", "wangwu", "zhaoliu"]
    var reversedNames = names.sorted(by: { s1 , s2  in return s1 > s2
    })
    print(reversedNames)
    
    执行结果如下:
    ["zhaoliu", "zhangsan", "wangwu", "lisi"]
    

    从单表达式闭包隐式返回

    • 单表达式闭包能够通过从它们的声明中删掉 return 关键字来隐式返回它们单个表达式的结果。
    let names = ["zhangsan", "lisi", "wangwu", "zhaoliu"]
    var reversedNames = names.sorted(by: { s1 , s2  in s1 > s2 })
    print(reversedNames)
    
    执行结果如下:
    ["zhaoliu", "zhangsan", "wangwu", "lisi"]
    

    简写实际参数名

    • Swift 自动对行内闭包提供简写实际参数名,可以通过 0,1,$2 等名字来引用闭包的实际参数值。
    let names = ["zhangsan", "lisi", "wangwu", "zhaoliu"]
    var reversedNames = names.sorted(by: { $0 > $1 })
    print(reversedNames)
    
    执行结果如下:
    ["zhaoliu", "zhangsan", "wangwu", "lisi"]
    

    运算符函数

    • Swift 的 String 类型定义了关于大于号(>)的特定字符串实现,让其作为一个有两个 String 类型形式参数的函数并返回一个 Bool 类型的值。这正好与 sorted(by:) 方法的形式参数需要的函数相匹配。因此,你能简单地传递一个大于号,并且 Swift 将推断你想使用大于号特殊字符串函数实现。
    let names = ["zhangsan", "lisi", "wangwu", "zhaoliu"]
    var reversedNames = names.sorted(by: > )
    print(reversedNames)
    
    执行结果如下:
    ["zhaoliu", "zhangsan", "wangwu", "lisi"]
    

    尾随闭包

    • 如果你需要将一个很长的闭包表达式作为函数最后一个实际参数传递给函数,使用尾随闭包将增强函数的可读性。尾随闭包是一个被书写在函数形式参数的括号外面(后面)的闭包表达式
    let names = ["zhangsan", "lisi", "wangwu", "zhaoliu"]
    var reversedNames = names.sorted{ $0 > $1}
    print(reversedNames)
    
    执行结果如下:
    ["zhaoliu", "zhangsan", "wangwu", "lisi"]
    

    相关文章

      网友评论

          本文标题:闭包和闭包表达式

          本文链接:https://www.haomeiwen.com/subject/dyribltx.html