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. org.apache.ibatis.binding.BindingException

    1.异常提示: org.apache.ibatis.binding.BindingException: Mapper method 'com.artup.dao.WorksDao.selectWork ...

  2. jQuery ajax调接口时跨域

    解决方法提炼 一.jsonp方法 在前端ajax配置jsonp参数,在后台配置jsonp设置,具体方法自行百度 二. 参考同源策略 把前端静态页面放在tomcat内webapp下,和后台文件同目录, ...

  3. Java Struts2 (四)

    一.contextMap中的数据操作 root根:List 元素1 元素2 元素3 元素4 元素5 contextMap:Map key value application Map key value ...

  4. Excellent JD

    Job description About the role We are looking for a talented engineer who has excellent cloud skills ...

  5. 04_zookeeper的watcher机制

    [watcher简述] * zk针对每个节点的操作,都会有一个监督者:watcher * 当监控的某个对象(znode)发生了变化,则出发watcher * zk中的watcher是一次性的,出发后立 ...

  6. Git学习-Git配置(一)

    零.前言 Git是一个工具,就没必要把时间浪费在那些"高级"但几乎永远不会用到的命令上.一旦你真的非用不可了,到时候再自行Google或者请教专家也未迟. 如果你是一个开发人员,想 ...

  7. Raspberry 安装vstudio

    Visual Studio Code微软公司推出的一款轻量级的Visual Studio风格的跨平台的IDE.当然,除了Windows,OSX,还能在树莓派上使用.目前树莓派上可用的IDE真不多,VS ...

  8. 解决 sourcetree git ssh私钥问题

    最近遇到个问题,git仓库用gitbash,更新和提交都是没问题的,用界面化工具SourceTree就一直提示下面信息: git -c diff.mnemonicprefix=false -c cor ...

  9. [EffectiveC++]item39:明智而审慎地使用private

    187页 private继承意味implementedin-terms-of(根据某物实现出).如果你让class D以private形式继承class B,你的用意为了采用class B内已经备妥的 ...

  10. UVa 580 - Critical Mass(递推)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...