Swift学习笔记7:关闭
闭包 捕 引用和将其存储在任意常量和变量的上下文。 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:关闭的更多相关文章
- 【swift学习笔记】二.页面转跳数据回传
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
- Swift学习笔记(一)搭配环境以及代码运行成功
原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记4——扩展、协议
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记3——类、结构体、枚举
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记2——函数、闭包
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记1——基础部分
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- Swift学习笔记一
最近计划把Swift语言系统学习一下,然后将MagViewer用这种新语言重构一次,并且优化一下,这里记录一下Swift的学习笔记. Swift和Objective-C相比,在语法和书写形式上做了很多 ...
- 记录:swift学习笔记1-2
swift还在不断的更新做细微的调整,都说早起的鸟儿有虫吃,那么我们早点出发吧,趁着国内绝大多数的coder们还没有开始大范围普遍应用. 网上有些大神说:swift很简单!我不同意这个观点,假如你用h ...
- Swift学习笔记(14)--方法
1.分类 方法分为实例方法和类型方法 实例方法(Instance Methods):与java中的类似,略 类型方法(Type Methods):与java.oc中的类方法类似.声明类的类型方法,在方 ...
随机推荐
- CI控制器调用内部方法并加载对应模板的做法
当我打开链接:http://localhost/3g/index/open/a/b? from=timeline后,推断链接中的from是否等于timeline,假设等于timeline.那么就调用控 ...
- vmware: The file system upon which * resides is critically low on free space.
The file system upon which ******.localized/Windows XP Professional.vmwarevm' resides is critically ...
- 使用配置文件(.settings、.config)存储应用程序配置
原文:使用配置文件(.settings..config)存储应用程序配置 引言 我不知大家早先是如何保存应用程序配置,以备下次打开时使用的,反正我开始学.Net的时候就去研究序列化,以二进制或XML格 ...
- 简单fcgi程序
1.头文件 #include <fcgi_stdio.h> 2.while(FCGI_Accept()>=0)//这里进入循环,前台每请求一次fcgi服务,就循环一次 循环内处理: ...
- CC2530 外部中断 提醒
#include "ioCC2530.h" #define uchar unsigned char #define led1 P1_0 #define led2 P1_ ...
- servlet 实现下载文件
servlet: public class UpAndDownServlet extends HttpServlet { public void doPost(HttpServletRequest r ...
- 入门git
入门git 0x01前言 既然没有华丽的出场,那就平凡的分享,首先我要说明一点本篇文章针对Git初学者,对我自己学Git的资源的整合,其实本篇索引应该在我写Git系列文章的时候就紧跟着放上索引的, ...
- Win 10开门人类智慧的世界领先
3月18日,从微软硬件project大会(WinHEC 2015)上传来好消息:今年夏天,Win 10将要正式公布.Win 10公布,有何新意? 微软新领导人纳德拉(Nadella)主张:运计算,大数 ...
- Javascript 进阶 作用域 作用域链
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/25076713 一直觉得Js很强大,由于长期不写js代码,最近刚好温故温故. 1. ...
- 【Cocos2d-x】源代码分析之 2d/ui/Widget
从今天開始 咱也模仿 红孩儿这些大牛分析源代码 ,因为水平有限 不正确之处欢迎狂喷.哈哈. #ifndef __UIWIDGET_H__ #define __UIWIDGET_H__ #include ...