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. Git 命令 操作

    常用 Git 命令清单 我每天使用 Git ,但是很多命令记不住.一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单. ...

  2. 04_dubbo_ioc

    [dubbo的IOC实现方法] dubbo的IOC具体实现在:T injectExtension( T instance )方法中,该方法在3个地方被使用: ExtensionLoader.getEx ...

  3. Android 快速切换到主线程更新UI的几种方法

    此最近看了网上,在子线程更新UI的方法,说法很多,但都不是很全面.在此我争取做到总结的全面一些,希望以后对自己,对大家都有一些帮助. 方法一: view.post(Runnable action) 假 ...

  4. 【Python】卸载完Python3 之后 Python2 无法打开IDLE

    安装官方的Python带Idle但是却无法打开,百度谷歌了几种解决方法,加上自己的实际境况予以解决. 我的python是直接安装在C盘下的. 1.首先是设置环境变量: Path=C:\Python27 ...

  5. Maven 安装与使用(一)

    1. 安装 参考:http://maven.apache.org/install.html A. win7环境下,官网下载maven安装文件 B. 解压缩maven文件 C. 确认已配置好JAVA环境 ...

  6. mybatis支持的jdbc类型

    参考mybatis的枚举JdbcType源码: 关于这些类型mybatis是如何处理可以看一下TypeHandler类的源码.

  7. python 替换指定目录下,所有文本字符串

    网页保存后,会把js文件起名为.下载,html里面的引用也会有,很不美观,解决方案:用python替换字符串 import os import re """将当前目录下所 ...

  8. bootstrap colorscheme以及theme自动生成

    http://paintstrap.com/ 是一个根据adobe kuler color scheme自动生成theme 的工具,比较直观好用,对于调整前端theme有一定参考意义

  9. SQL点点滴滴_查询类型和索引-转载

    当您考虑是否要对列创建索引时, 请估计在查询中使用列的方式, 下表介绍了索引对其有用的查询类型. 表中的示例基于 AdventureWorks2008R2 示例数据库, 在 SQL Server Ma ...

  10. JAVA程序员常用开发工具

    1.JDK (Java Development Kit)Java开发工具集 SUN的Java不仅提了一个丰富的语言和运行环境,而且还提了一个免费的Java开发工具集(JDK).开发人员和最终用户可以利 ...