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中的类方法类似.声明类的类型方法,在方 ...
随机推荐
- poj 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS (母函数)
/* 给出一个数n,把它拆分成若干个数的和,要求最大的数在中间并向两边非递增.问拆法有多少种. 母函数.枚举中间的那一个数.由于左右对称.所以仅仅须要求左边部分的方案就可以. 注意,左右两部分的取数必 ...
- 从后台绑定数据到ligerui 的comboBox下拉框组件
这次来记录一下ligerUI的comboBox下拉框组件,ligerUI的API里也有相关描写叙述,上面都是前台写死数据,然后显示在组件中,我这次要说的是将后台的数据绑定到下拉框组件中,废话不多说. ...
- Android多线程文件下载器
本应用实现的是输入文件的网络的地址,点击button開始下载,下载过程中有进度条和后面的文本提示进度, 下载过程中button不可点击,防止反复的下载,完成下载后会进行Toast的提示显示, 而且回复 ...
- codeforces 112APetya and Strings(字符串水题)
A. Petya and Strings 点击打开题目 time limit per test 2 seconds memory limit per test 256 megabytes input ...
- ExtJS与JQuery对照
首先在介绍ExtJS和JQuery,然后进行比较 一个.什么是ExtJS? 1.ExtJS能够用来开发RIA也即富client的AJAX应用,是一个用javascript写的,主要用于创建前端用户界面 ...
- 熬之滴水穿石:Spring--精简的J2EE(6)
48--曾用过的View 在Spring MVC架构中View实际上是有多种选择的.JSP是首选的view,实际上在J2E ...
- codeforces55D数位dp
codeforces55D 查询给定区间内的beautiful number. 一个数字是beautiful number当且仅当能被自己的各个数字不为0的位整除. 这个dp的状态还是挺难想的.一个 ...
- java split小结(转)
2016.03.27下午参加华为机试,简单扫了一眼几个题的标题,选择了一道字符串问题,其实该题非常非常的简单,可以说是简单的不能再简单了,而且有很多种解法,上机时我选择了直接借用java提供的一些函数 ...
- 不root的情况下 查看App的数据表
一直以来查看sqlite的数据库都须要root才干查看,可是公司的好多測试机root起来比較麻烦~~~ 近期刚好项目上线,略闲, 于是决定写一个libraryproject便于以后调试代码 关键代码例 ...
- ostringstream使用
ostringstream使用 [本文来源于]http://www.builder.com.cn/2003/0304/83250.shtml http://www.cppblog.com/alanto ...