zoukankan      html  css  js  c++  java
  • 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 } )

  • 相关阅读:
    js模板
    block,inline和inline-block概念和区别
    jquery parent和parents,children和find
    (CVE-2015-5254)ActiveMQ 反序列化漏洞复现
    办公系统致远OA漏洞
    CVE-2018-16509 GhostScript 沙箱绕过(命令执行)漏洞
    phpmyadmin-相关漏洞详解
    XXL-JOB(任务调度中心)-反弹getshell
    组策略(域和域服务的搭建)
    解决在NAT模式下物理机无法ping通虚拟机的问题
  • 原文地址:https://www.cnblogs.com/caios/p/3858966.html
Copyright © 2011-2022 走看看