美文网首页
Swift学习(七)闭包

Swift学习(七)闭包

作者: 黄成瑞 | 来源:发表于2020-06-08 19:02 被阅读0次
一、闭包

1.闭包是自包含的函数代码块,可以在代码中被传递和使用。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。被称为包裹常量和变量。 Swift 会为你管理在捕获过程中涉及到的所有内存操作。全局和嵌套函数实际上也是特殊的闭包。
2.闭包的三种形式:全局函数是一个有名字但不会捕获任何值的闭包、嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包、闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的匿名闭包
3.Swfit闭包表达式拥有简洁风格。使用的时候要注意进行语法优化(利用上下文推断参数和返回值类型、隐式返回单表达式闭包,即单表达式闭包可以忽略retrun关键字、参数名称缩写、尾随闭包语法)
二、闭包表达式(从无到有然后一步步的优化)
sorted(by:) 是基于你提供的排序闭包表达式的判断结果对数组中的值(类型确定)进行排序。一旦它完成排序过程,sorted(by:) 方法会返回一个与旧数组类型大小相同类型的新数组,该数组的元素有着正确的排序顺序。原数组不会被 sorted(by:) 方法修改。sorted(by:) 方法接受一个闭包,该闭包函数需要传入与数组元素类型相同的两个值,并返回一个布尔类型值来表明当排序结束后传入的第一个参数排在第二个参数前面还是后面。如果第一个参数值出现在第二个参数值前面,排序闭包函数需要返回 true,反之返回 false。如果第一个字符串(s1)大于第二个字符串(s2),backward(_:_:) 函数会返回 true,表示在新的数组中 s1 应该出现在 s2 前。
题目:对一个 String 类型的数组进行排序(排序闭包函数类型需为 (String, String) -> Bool)
1.排序方法
        let name = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
        func backward(_ s1: String, _ s2: String) -> Bool {
            return s1 > s2
        }
        var reversedNames = name.sorted(by: backward)
        print(reversedNames)
2.闭包表达式(闭包表达式参数 可以是 in-out 参数,但不能设定默认值,in-out意思是block内部可可以修改,可以输出,如果你命名了可变参数,也可以使用此可变参数。元组也可以作为参数和返回值。)
        { (parameters) -> return type in
            statements // 声明
        }
        let name = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
        var reversedNames = name.sorted(by: {(s1: String, s2: String) -> Bool in // 闭包的函数体部分由关键字 in 引入。该关键字表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始。
            return s1 > s2
        })
        print(reversedNames)
        // 简化
        reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 } ) // 参数叫做排序闭包函数
        print(reversedNames)
3.根据上下文推断类型
因为排序闭包函数是作为参数传入的,Swift可以推断其参数和返回值的类型(实际上,通过内联闭包表达式构造的闭包作为参数传递给函数或方法时,总是能够推断出闭包的参数和返回值类型。这意味着闭包作为函数或者方法的参数时,你几乎不需要利用完整格式构造内联闭包。

)
        let name = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
        var reverseNames = name.sorted(by: { (s1, s2) -> Bool in return s1 > s2 } )
        var reverseNames = name.sorted(by: { s1, s2 in return s1 > s2 } )
        print(reverseNames)
4.单表达式闭包隐式返回:单行表达式闭包可以通过省略 return 关键字来隐式返回单行表达式的结果(sorted(by:) 方法的参数类型明确了闭包必须返回一个 Bool 类型值。因为闭包函数体只包含了一个单一表达式(s1 > s2),该表达式返回 Bool 类型值,因此这里没有歧义,return 关键字可以省略。)
        let name = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
        var reverseNames = name.sorted(by: { s1, s2 in s1 > s2 } )
        print(reverseNames)
5.参数名称缩写:

相关文章

  • swift闭包学习

    闭包作为参数 参考 Swift学习之闭包

  • Swift5.x-枚举(中文文档)

    引言 继续学习Swift文档,从上一章节:闭包,我们学习了Swift闭包相关的内容,如闭包的定义和使用、闭包的简写...

  • Swift学习笔记(1)

    SWift学习笔记 闭包 闭包表达式 闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 ...

  • Swift学习(七)闭包

  • Swift-闭包

    Swift 闭包 函数 ()->() Swift 中的闭包和 Objective-C 中的 block 类似,闭包...

  • Swift闭包和函数

    函数在Swift中只是一种特殊的闭包,闭包在Swift语言中是一等公民,支持闭包嵌套和闭包传递。Swift中的闭包...

  • swift学习笔记 ⑥ —— 闭包

    Swift学习笔记 - 文集 闭包,就是能够读取其他函数内部变量的函数。Swift 中的闭包与 C 和 OC 中的...

  • swift4 闭包

    swift 闭包 闭包:swift 中 函数是闭包的一种类似于oc的闭包闭包表达式(匿名函数) -- 能够捕获上下...

  • Swift中的闭包

    在Swift中有两种闭包,逃逸闭包(@escaping)和非逃逸闭包(@nonescaping)。从Swift 3...

  • 100 Days of Swift - Day 06 - 闭包(

    100 Days of Swift - Day 06 - 闭包Closures 6.1 闭包 Swift函数也属于...

网友评论

      本文标题:Swift学习(七)闭包

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