Swift_闭包


点击查看源码

闭包优化

//闭包优化
func testClosures() {
//函数做参数 排序
let names = ["XuBaoAiChiYu", "1045214799", "iOS", "Swift", "OC"]
func backwards(_ s1: String, _ s2: String) -> Bool {
return s1 > s2
}
var reversed = names.sorted(by: backwards)
print(reversed) //闭包排序
reversed = names.sorted(by: { (s1: String, s2: String) -> Bool in
return s1 > s2
})
print(reversed) //可以写为一行
reversed = names.sorted( by: { (s1: String, s2: String) -> Bool in return s1 > s2 } )
print(reversed) //闭包可以自动判断参数类型和返回属性
reversed = names.sorted( by: { s1, s2 in return s1 > s2 } )
print(reversed) //当只有一行时,可省略return写法。
reversed = names.sorted( by: { s1, s2 in s1 > s2 } )
print(reversed) //闭包中的参数可使用$去获得 第一个参数为$0 第二个为$1
reversed = names.sorted( by: { $0 > $1 } )
print(reversed) //当闭包中只有两个参数 做比较操作时 只需要写入符号
reversed = names.sorted(by: >)
print("\(reversed)") /* print ["iOS", "XuBaoAiChiYu", "Swift", "OC", "1045214799"]
["iOS", "XuBaoAiChiYu", "Swift", "OC", "1045214799"]
["iOS", "XuBaoAiChiYu", "Swift", "OC", "1045214799"]
["iOS", "XuBaoAiChiYu", "Swift", "OC", "1045214799"]
["iOS", "XuBaoAiChiYu", "Swift", "OC", "1045214799"]
["iOS", "XuBaoAiChiYu", "Swift", "OC", "1045214799"]
["iOS", "XuBaoAiChiYu", "Swift", "OC", "1045214799"] */
}

尾随闭包

//尾随闭包
func testTrailingClosures() { let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] //如果函数需要一个闭包作为参数,且这个参数是最后一个参数.
//尾随闭包可以放在函数参数列表外,也就是括号外
var reversed = names.sorted() { $0 > $1 }
print("\(reversed)") //如果一个闭包表达式作为一个唯一的参数,你又正在使用尾随闭包,可以省略()
reversed = names.sorted { $0 > $1 }
print("\(reversed)") /* print ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
["Ewa", "Daniella", "Chris", "Barry", "Alex"] */
}

捕获值

//捕获值
func testCapturingValues() {
/*
闭包可以根据环境上下文捕获到定义的常量和变量。闭包可以引用和修改这些捕获到的常量和变量,
就算在原来的范围内定义为常量或者变量已经不再存在(很牛逼)。
在Swift中闭包的最简单形式是嵌套函数。
*/
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementer() -> Int {
runningTotal += amount
return runningTotal
}
return incrementer
} let incrementByTen = makeIncrementer(forIncrement: 10)
print("\(incrementByTen())")
print("\(incrementByTen())")
print("\(incrementByTen())") let incrementBySeven = makeIncrementer(forIncrement: 7)
print("\(incrementBySeven())")
print("\(incrementByTen())") //闭包是引用类型
let alsoIncrementByTen = incrementByTen
print(alsoIncrementByTen()) /* print 10
20
30
7
40
50 */
}

避免内存泄露

//避免内存泄露
var completionHandlers: [() -> Void] = []
func someFunctionWithNoescapeClosure(_ closure: () -> Void) {
closure()
// completionHandlers.append(closure) //会报错 closure无法被保存
} func someFunctionWithEscapingClosure(_ completionHandler: @escaping () -> Void) {
completionHandler()
completionHandlers.append(completionHandler)
} class SomeClass {
var x = 10
func doSomething() {
//内存溢出
someFunctionWithEscapingClosure { self.x = 100 }
someFunctionWithNoescapeClosure { x = 200 }
}
}
func testNonescapingClosures() {
//@noescape 保留环问题 闭包中布应使用self 避免内存泄露
let instance = SomeClass()
instance.doSomething()
print(instance.x) completionHandlers.first?()
print(instance.x) /* print 200
100 */
}

Swift_闭包的更多相关文章

  1. Swift_类型选择

    Swift_类型选择 点击查看源码 //类型选择 func test() { class MediaItem { } class Movie: MediaItem { } class Song: Me ...

  2. Swift_初始化

    #Swift_初始化 点击查看源码 初始化结构体 //初始化结构体 func testInitStruct() { //结构体 类中默认方法 struct Size { //宽 var width = ...

  3. 《Web 前端面试指南》1、JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

  4. 干货分享:让你分分钟学会 JS 闭包

    闭包,是 Javascript 比较重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...

  5. 深入浅出JavaScript之闭包(Closure)

    闭包(closure)是掌握Javascript从人门到深入一个非常重要的门槛,它是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面写下我的学习笔记~ 闭包-无处不 ...

  6. javascript之闭包理解以及应用场景

    半个月没写博文了,最近一直在弄小程序,感觉也没啥好写的. 之前读了js权威指南,也写了篇博文,但是实话实说当初看闭包确实还是一头雾水.现在时隔一个多月(当然这一段时间还是一直有在看闭包的相关知识)理解 ...

  7. js闭包 和 prototype

    function test(){ var p=200; function q(){ return p++; } return q; } var s = test(); alert(s()); aler ...

  8. js闭包for循环总是只执行最后一个值得解决方法

    <style> li{ list-style: none;width:40px;height: 40px;text-align:center;line-height: 40px;curso ...

  9. JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象

    一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...

随机推荐

  1. CSS 3动画

    CSS 3在原来的基础上新增了变形和动画相关的属性,通过这些属性可以实现以前需要大段JavaScript才能实现的功能.css 3的变形功能可以对HTML元素执行位移.旋转.缩放.倾斜4种几何变换,借 ...

  2. Python-网络编程(一)

    首先我们python基础部分已经学完了,而socket是我们基础进阶的课程,也就是说,你自己现在完全可以写一些小程序了,但是前面的学习和练习,我们写的代码都是在自己的电脑上运行的,虽然我们学过了模块引 ...

  3. 前端使用nginx上传文件时,进度获取不对

    在使用iview时,上传文件获取进度时onUploadProgress返回数据不对. 原因是开启了nginx代理,本地上传时先传到本地nginx然后在传到服务器,导致获取进度不对 解决:在nginx的 ...

  4. 1-4 Sass的基本特性-基础

    [Sass]声明变量 定义变量的语法: 在有些编程语言中(如,JavaScript)声明变量都是使用关键词“var”开头,但是在 Sass 不使用这个关键词,而是使用大家都喜欢的美元符号“$”开头.我 ...

  5. SpringCloud+Git+Maven+Docker+Jenkins自动化构建

    1.JDK安装-OpenJDK安装 yum list java-1.8* yum install -y java-1.8.0-openjdk-devel.x86_64 PS: JDK安装有两种方法:一 ...

  6. 05_zookeeper的ACL

    [ACL概述] ACL:access control Lists,权限控制. * 针对节点可以设置相关的读写等权限,目的是为了保障数据安全性. * 权限permissions可以指定不同的权限范围以及 ...

  7. visual studio 2013的C++开发环境不错--vs2013安装试用手记

    原文:http://blog.csdn.net/haoyujie/article/details/24370189 从visual studio 体系,最后一次对C++实现了大的改进,那还是vs 7. ...

  8. Python爬虫教程-12-爬虫使用cookie爬取登录后的页面(人人网)(上)

    Python爬虫教程-12-爬虫使用cookie(上) 爬虫关于cookie和session,由于http协议无记忆性,比如说登录淘宝网站的浏览记录,下次打开是不能直接记忆下来的,后来就有了cooki ...

  9. Oracle案例07——ORA-28000: the account is locked

    遇到这个错误,一般我们想到的是数据库用户被锁,只需要执行用户解锁即可恢复,但这里之所以写出来是因为比较奇葩的一个问题. 昨天下午接同事信息,说一个用户连接报被锁,经过沟通发现其实连接一个ADG的备库作 ...

  10. ego network的概念

    转:http://greatpowerlaw.wordpress.com/2013/01/05/ego-network/ 所谓的ego network,它的节点是由唯一的一个中心节点(ego),以及这 ...