闭包  引用和将其存储在任意常量和变量的上下文。 Swift 你会管理 捕获 过程中涉及到的内存操作。

在 函数 章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包採取例如以下三种形式之中的一个:

1. 全局函数是一个有名字但不会捕获不论什么值的闭包

2. 嵌套函数是一个有名字并能够捕获其封闭函数域内值的闭包

3. 闭包表达式是一个能够捕获其上下文中变量或常量值的没有名字的闭包

一、闭包表达式

闭包函数类似于Objective-C中的block。以下我们用事实说话:

let counts = [3,2,5,1,6]
//********** 方法1:使用普通函数*******
func sortInc(item1:Int,item2:Int) ->Bool{
return item1 < item2
}
sort(counts, sortInc)
//********** 方法2:使用闭包函数*******
sort(counts, {(a:Int,b:Int) -> Bool in return a<b})

Swift 标准库提供了 sort 函数,会依据您提供的排序闭包将已知类型数组中的值进行排序。

          方法1中使用的是普通函数,方法2传入的是一个闭包。在这里,这2个方法终于的效果是一样的。可是明显的,方法2写起来例如法1要简单

     1)闭包表达式语法

{ (parameters) -> returnType in      statements  }  

关键:闭包表达式主要分为3个部分

               ①闭包表达式全部内容都由大括号{}括起来

               ②闭包表达式keywordin前面部分和函数的定义是一样的。仅仅是去掉了func和函数名

               ③闭包表达式keywordin后面部分是函数的详细代码

     2) 依据上下文判断类型

          由于排序闭包是作为函数的參数进行传入的。Swift能够判断其參数和返回值的类型。上面的方法2中的代码能够改为以下的形式:

sort(counts,
{a,b in
return a<b})

3)单一表达式闭包能够省略 return

            单一表达式闭包能够通过隐藏 return keyword来隐式返回单行表达式的结果。

上面的代码还能够省略:

sort(counts,
{a,b in a<b})

这个样例中,sort第二个參数必须返回一个Bool值,由于闭包仅仅包括一个单一表达式a<b。而且表达式返回Bool类型。所以return能够省略

4)參数名称缩写

               Swift 会自己主动为内联函数提供了參数名称缩写功能。您能够直接通过 $0,$1,$2 来顺序调用闭包的參数。

               假设您在闭包表达式中使用參数名称缩写。您能够在闭包參数列表中省略对其的定义,而且相应參数名称缩写的类型会通过函数类型进行判断。 in keyword也相同能够被省略。由于此时闭包表达式全然由闭包函数体构成。上面的样例能够简化成这样

           sort(counts,
{$0<$1})   //$0
和 $1
表示闭包中第一个和第二个Int类型的參数。

看!Swift的闭包多洋气啊。居然能够简化成这样

5)运算符函数

          实际上另一种更简单的方法。Swift中<符号能够作为一个函数来使用

                     sort(counts,
<)

2. Trailing 闭包

          假设您须要将一个非常长的闭包表达式作为最后一个參数传递给函数。能够使用 trailing 闭包来增强函数的可读性。

Trailing 闭包是一个书写在函数括号之外(之后)的闭包表达式。函数支持将其作为最后一个參数调用。上面的样例用Trailing 闭包形式表达例如以下

               sort(counts){$0<$1}
  //$0
和 $1
表示闭包中第一个和第二个Int类型的參数。



          注意:假设函数仅仅须要闭包表达式一个參数。当您使用 trailing 闭包时,您甚至能够把 () 省略掉。



3. 捕获 (Caputure)

          闭包能够在其定义的上下文中捕获常量或变量。

即使定义这些常量和变量的原域已经不存在。闭包仍然能够在闭包函数体内引用和改动这些值。

func makeIncrementor(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementor() -> Int {
runningTotal += amount
return runningTotal
}
return incrementor
}

注意:

               Swift 会决定捕获引用还是拷贝值。

您不须要标注 amount 或者 runningTotal 来声明在嵌入的 incrementor 函数中的使用方式。 Swift 同一时候也处理 runingTotal 变量的内存管理操作,假设不再被 incrementor 函数使用,则会被清除。

          2) 闭包是引用类型

               函数和闭包都是引用类型。闭包的赋值都是指针赋值。这意味着假设您将闭包赋值给了两个不同的常量/变量,两个值都会指向同一个闭包:

func makeIncrementor (forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementor() -> Int {
runningTotal += amount
return runningTotal
}
return incrementor
}
let incrementByTen = makeIncrementor(forIncrement: 10)
let a = incrementByTen

这里a和incrementByTen都是指针,都他们中一个的值改变,还有一个会随着一起改变

版权声明:本文博主原创文章,博客,未经同意不得转载。

Swift学习笔记7:关闭的更多相关文章

  1. 【swift学习笔记】二.页面转跳数据回传

    上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...

  2. Swift学习笔记(一)搭配环境以及代码运行成功

    原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...

  3. swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  4. swift学习笔记4——扩展、协议

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  5. swift学习笔记3——类、结构体、枚举

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  6. swift学习笔记2——函数、闭包

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  7. swift学习笔记1——基础部分

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  8. Swift学习笔记一

    最近计划把Swift语言系统学习一下,然后将MagViewer用这种新语言重构一次,并且优化一下,这里记录一下Swift的学习笔记. Swift和Objective-C相比,在语法和书写形式上做了很多 ...

  9. 记录:swift学习笔记1-2

    swift还在不断的更新做细微的调整,都说早起的鸟儿有虫吃,那么我们早点出发吧,趁着国内绝大多数的coder们还没有开始大范围普遍应用. 网上有些大神说:swift很简单!我不同意这个观点,假如你用h ...

  10. Swift学习笔记(14)--方法

    1.分类 方法分为实例方法和类型方法 实例方法(Instance Methods):与java中的类似,略 类型方法(Type Methods):与java.oc中的类方法类似.声明类的类型方法,在方 ...

随机推荐

  1. 使用javaDate类代数据仓库维度表

    使用javaDate类代数据仓库维度表 Date类别: ,返回一个相对日期的毫秒数.精确到毫秒.但不支持日期的国际化和分时区显示. Date 类从Java 开发包(JDK)1.0 就開始进化,当时它仅 ...

  2. C++ Primer 学习笔记_98_特殊的工具和技术 --优化内存分配

    特殊的工具和技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自己主动执行合适的构造函数来初始化每一个动态 ...

  3. Redis11种Web应用场景

    Redis的一个非常大优点就是能够不用整个转入到这个数据库,而是能够沿用之前的MySQL等数据库,而仅在一些特定的应用场景通过Redis的特性提高效率.本文列出了11个这种Web应用场景,如显示最新的 ...

  4. dede 首页或列表页调用文章内容页body内容

    在使用dede过程,有的朋友会调调出文章的列表的内容出来,怎么调呢?当然是用dede的传参的数据查询语句了,方法如下: {dede:arclist flag=h typeid=2 row=1 titl ...

  5. MySQL 改动用户password及重置rootpassword

    为数据库用户改动password是DBA比較常见的工作之中的一个.对于MySQL用户账户的password改动,有几种不同的方式.推荐的方式使用加密函数来改动password. 本文主要描写叙述了通过 ...

  6. Python学习入门基础教程(learning Python)--3.1Python的if分支语句

    本节研究一下if分支语句. if分支语句是Python下逻辑条件控制语句,用于条件执行某些语句的控制操作,当if后的条件conditon满足时,if其下的语句块被执行,但当if的控制条件condito ...

  7. hdu 4882 ZCC Loves Codefires(数学题+贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4882 ------------------------------------------------ ...

  8. 编译Nginx支持Tcp_warppers

    Tcp wrappers : Transmission Control Protocol (TCP) Wrappers 为由 inetd 生成的服务提供了增强的安全性.TCP Wrappers 是一种 ...

  9. mysql安装前的系统准备工作(转)

    一.系统环境总结:

  10. 用MODELLER构建好模型后对loop区域进行自动的优化过程

    一:对生成的模型的所有的loop区域进行优化 # Homology modeling by the automodel class from modeller import * from modell ...