• Welcome to Swift (苹果官方Swift文档初译与注解三十六)---254~260页(第六章-- 闭包)


    Closures (闭包)

      闭包是一段包含自身功能的代码块,它可以在代码中传递.在Swift中,闭包的概念与C和OC中的block相似,与其他语言的lambdas相似.

      当常量和变量在闭包中定义的时候,闭包可以获取(capturing)和存储常量和变量的引用,这像是完全包裹着变量和常量,因此,取名闭包.Swift会为你处理相关的内存管理工作.

      注意:

      如果不熟悉”捕获”(capturing)的概念也不必担心,它会在后面的 Capturing Values章节中详细介绍.

      全局函数和嵌套函数,通常意义上说,都是一种特定的闭包.闭包有三种形式:

    • 全局函数,它有名字但不会获取任何值;
    • 嵌套函数,它有名字,而且会获取它内部的值;
    • 闭包表达式,它是没有名字的闭包,它会获取封闭在内的值

      Swift的闭包表达式有一个清晰干净的样式;简写的建议:

    • 参数和返回值类型使用类型判断;
    • 使用默认的单表达式闭包;
    • 缩写参数名称;
    • 去除闭包语法声明;

    Closure Expressions (闭包表达式)

      前面介绍的嵌套函数,它定义自身代码块和名称在一个大的函数中.然后有时候,我们需要一个简写的情况,并且不需要完整的定义和命名.这种情况在你处理一个函数的参数是一个或者  多个函数的时候尤其明显.

      闭包表达式是一种简明内联的定义闭包方式.闭包表达式提供了几种可选的语法来最简单的使用定义闭包.

    The Sort Function (排序函数)

      Swift标准库提供了一个排序函数,叫做sort,它可以将数组的值排序,一旦完成排序过程,sort函数会返回一个新的数组,它与原数组类型,大小都相同,只是元素的顺序按照要求改变了.

      下面的闭包表达式例子使用了sort函数来排序数组String值,按照反字母表的顺序进行.这里初始化要被排序的数组:

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

      sort函数需要两个参数:

    • 已知类型的数组
    • 一个带两个参数的闭包,参数类型与数组元素类型相同.如果第一个值在排序时在第二个值前面,会返回true,否则返回false

      因为是排序一个String数组,因此排序闭包需要是一个函数类型:(String, String) -> Bool.

      闭包的一种形式是使用一个合适类型的函数,然后将它传递给闭包的第二个参数:

        func backwards(s1: String, s2: String) -> Bool {

            return s1 > s2

        }

        var reversed = sort(names, backwards)

        // reversed is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

      如果第一个字符串(s1)比第二个字符串(s2)大,函数backwards将返回true,它表示s1在s2的前面.对于字符串来说,大的意思是它在字母表中的位置靠后,例如字母B比字母A大,字符串  Tom比字符串Tim大.

    Closure Expression Syntax (闭包表达式语法)

      闭包表达式的通用格式为:

        { (parameters) -> return type in

            statements

        }

      闭包表达式语法可以用常量参数,变量参数以及 inout参数,默认值是不允许提供的.元组也可以作为参数以及返回值.

      下面的例子是backwards函数的闭包表达式版本:

        reversed = sort(names, { (s1: String, s2: String) -> Bool in

            return s1 > s2

            })

      注意,在闭包中定义的函数和返回值类型是根据backwards函数来定的.在这两个例子里,它都写为(s1: String, s2: String) -> Bool.然而,对于内联的闭包表达式,参数和返回值都要  写在()里面.

      闭包体是从关键字in开始作用.这个关键字表示闭包的参数定义以及执行完成后的返回值,以及闭包体从那里开始.

      因为闭包体非常短,它可以写在一行:

      reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )

  • 相关阅读:
    nginx公网IP无法访问浏览器
    Internet接入方式
    Adobe Photoshop Lightroom 5.3和序列号
    getopt
    printf
    scanf
    cycling -avoid the vicious cycle
    ACE handle_timeout 事件重入
    Linux查看程序端口占用
    The GNU C Library
  • 原文地址:https://www.cnblogs.com/caios/p/3858966.html
Copyright © 2020-2023  润新知