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中的类方法类似.声明类的类型方法,在方 ...
随机推荐
- UVa 1292 - Strategic game (树形dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: 点击打开链接 题目大意 给定一棵树,选择尽量少的节点,使得每个没有选中的结点至少和一个已选结点相邻. 思路 ...
- 设计模式之十:观察者模式(Observer)
观察者模式: 在对象之间定义了一种一对多的依赖关系.当一个对象改变它的状态时,全部依赖它的对象会自己主动接收通知并更新自己的状态. Define a one-to-many dependency be ...
- 调用WCF的异步方法
原文:调用WCF的异步方法 AsyncCallback aLoginCallback = delegate(IAsyncResult result) { var aSystemUser = WcfCl ...
- String的Split方法的用法与要注意事项
转自:http://shukuiyan.iteye.com/blog/1058672 之前在http://shukuiyan.iteye.com/blog/507915文中已经叙述过这个问题,但是最近 ...
- 关于Velocity加减法等四则运算的迷思
曾今有一个FreeMarker摆在我面前. 我没有好好珍惜, 遇到了Velocity我才想起失去的美好... 需求是把PC网页点击. 手机网页点击.App点击相加得到总点击量显示出来: $articl ...
- js实时监听input中值的变化
$(function(){ $('#inputid').bind('input propertychange', function() { // input 中的值 var params = $(th ...
- Thread Dump 和Java应用诊断(转)
Thread Dump 和Java应用诊断 Thread Dump是非常有用的诊断Java应用问题的工具,每一个Java虚拟机都有及时生成显示所有线程在某一点状态的thread-dump的能力.虽然各 ...
- intellij idea该插件开发摘要
最近在做一个intellij idea插件,功能是读取表和数据库信息字段和预先定义的模板来生成代码文件(实体,service,springmvc该controller,freemark文件等). 找了 ...
- WPF对于xml的简单操作(下下)插入节点并排序
正如T所说,下下,这个方法不堪入目, ̄□ ̄|| 贴上再说 //先搞个struct声明 private struct datastruct { public string x; public strin ...
- MySQL与Oracle的语法区别详细对比 (转)
Oracle和mysql的一些简单命令对比 1) SQL> select to_char(sysdate,'yyyy-mm-dd') from dual; SQL> select to_c ...