Swift 闭包(六)
http://blog.csdn.net/huangchentao/article/details/32714185
闭包 Closures
1.闭包表达式
闭包表达式是一种利用简单语法构建内联包的方式,提供一些语法优化,使得闭包代码变得更加简单明了
1.1sort函数
Swift标准库提供了sort函数,将已知类型数组中的值进行排序,返回一个与原数组大小相等但元素已正确排序的数组
sort函数需要传入两个参数:
1.已知类型的数组
2.传入两个跟数组相同类型参数的闭包函数,并返回一个布尔值告诉sort函数排序结束后传入的第一个参数排在第二个参数的前面还是后面,如果第一个参数值出现在第二个参数值前面,排序闭包函数需要返回true,否则返回false
- let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
该例子对String类型的数组进行排序,因此该排序闭包函数类型为 (String, String) -> Bool
提供排序闭包函数的另一种方式是写一个符合其类型要求的普通函数,并将其作为sort函数的第二个参数传入
- func backwards(s1: String, s2: String) -> Bool {
- return s1 > s2
- }
- var reversed = sort(names, backwards)
- // reversed is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
1.2闭包表达式语法
闭包表达式一般形式,可以使用常量、变量和inout类型作为参数,不提供默认值,也可以在参数列表后面使用可变参数。元组也可以作为参数和返回值
- { (parameters) -> return type in
- statements
- }
- // backwards函数对应的闭包表达式版本,闭包的函数体部分由关键字 in 引入
- // 该关键字表示闭包的参数和返回值类型定义已经完成,闭包函数体开始
- reversed = sort(names, { (s1: String, s2: String) -> Bool in
- return s1 > s2
- })
- // 简写形式
- reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )
1.3根据上下文推断类型
因为排序闭包函数是作为sort函数的参数进行传入,Swift可以判断其参数和返回值的类型
- reversed = sort(names, { s1, s2 in return s1 > s2 } )
1.4单行表达式闭包隐式返回
单行表达式闭包可以通过隐藏return关键字来隐式返回单行表达式的结果
- reversed = sort(names, { s1, s2 in s1 > s2 } )
1.5参数名称缩写
Swift自动为内联函数提供了参数名称缩写功能,可直接通过 $0,$1,$2 来顺序调用闭包的参数。如果您在闭包表达式中使用参数名称缩写,可以在闭包参数列表中省略对其的定义,并且对应参数名称缩写的类型会通过函数类型进行推断。 in关键字也同样可以被省略,因为此时闭包表达式完全由闭包函数体构成
- reversed = sort(names, { $0 > $1 } )
1.6运算符函数
Swift 的String类型定义了关于大于号 (>) 的字符串实现,其作为一个函数接受两个String类型的参数并返回Bool类型的值。 而这正好与sort函数的第二个参数需要的函数类型相符合。 因此可以简单地传递一个大于号,Swift可以自动推断出您想使用大于号的字符串函数实现
- reversed = sort(names, >)
2.尾随闭包
如果需要将一个很长的闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强函数的可读性。如果函数只需要闭包表达式一个参数,当使用尾随闭包时,甚至可以把()省略掉。
- func someFunctionThatTakesAClosure(closure: () -> ()) {
- // function body goes here
- }
- // 以下是不使用尾随闭包进行函数调用
- someFunctionThatTakesAClosure({
- // closure's body goes here
- })
- // 以下是使用尾随闭包进行函数调用
- someFunctionThatTakesAClosure() {
- // trailing closure's body goes here
- }
- //在上例中作为sort函数参数的字符串排序闭包可以改写为:
- reversed = sort(names) { $0 > $1 }
- let digitNames = [
- 0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",
- 5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
- ]
- let numbers = [16, 58, 510]
- let strings = numbers.map {
- (var number) -> String in
- var output = ""
- while number > 0 {
- output = digitNames[number % 10]! + output
- number /= 10
- }
- return output
- }
- // strings is inferred to be of type String[]
- // its value is ["OneSix", "FiveEight", "FiveOneZero"]
3.值捕获
闭包可以在其定义的上下文中捕获常量或变量。即使定义这些常量和变量的原域已经不存在,闭包仍然可以在闭包函数体内引用和修改这些值。Swift最简单的闭包形式是嵌套函数,也就是定义在其他函数的函数体内的函数。 嵌套函数可以捕获其外部函数所有的参数以及定义的常量和变量。
- func makeIncrementor(forIncrement amount: Int) -> () -> Int {
- var runningTotal = 0
- func incrementor() -> Int {
- runningTotal += amount
- return runningTotal
- }
- return incrementor
- }
- func incrementor() -> Int {
- runningTotal += amount
- return runningTotal
- }
- let incrementByTen = makeIncrementor(forIncrement: 10)
- incrementByTen()
- // returns a value of 10
- incrementByTen()
- // returns a value of 20
- incrementByTen()
- // returns a value of 30
- let incrementBySeven = makeIncrementor(forIncrement: 7)
- incrementBySeven()
- // returns a value of 7
- incrementByTen()
- // returns a value of 40
4.闭包是引用类型
无论将函数/闭包赋值给一个常量还是变量,实际都是将常量/变量的值设置为对应函数/闭包的引用,如果将闭包赋给了两个不同的常量/变量,两个值都会指向同一个闭包
- let alsoIncrementByTen = incrementByTen
- alsoIncrementByTen()
- // returns a value of 50
版权声明:本文为博主原创文章,未经博主允许不得转载。
Swift 闭包(六)的更多相关文章
- Swift闭包概念与常见使用场景总结
·Swift 闭包 闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些 ...
- Swift --闭包表达式与闭包(汇编分析)
在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数! 一.闭包表达式 概念 闭包表达式与定义函数的语法相对比,有区别如下: 去除了func 去除函数名 返回值类型添加了关键 ...
- swif(六)swift闭包
// // main.swift // LessonSwiftSix // // Created by keyan on 15/9/13. // Copyright (c) 2015年 keyan. ...
- swift 闭包循环引用
当使用闭包时,类本身持有self,然后又在闭包中访问了self或者self的属性,就会导致恶心额循环引用.swift提供的解决方法是在闭包中定义捕获列表,捕获列表是闭包想怎么引用捕获来的变量.例如下面 ...
- swift 闭包
闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着 这些常量和变量,俗称闭包. Swift标准库中提供了sort排序函数,sort函数的第二个参数是个闭包.和OC中的bl ...
- [ios][swift]使用swift闭包进行viewcontroller反向传值
闭包参考:http://c.biancheng.net/cpp/html/2285.html 闭包详解 传值参考:http://www.tuicool.com/articles/vy2uUz Sw ...
- swift 闭包简写实际参数名$0、$1等理解
Swift 自动对行内闭包提供简写实际参数名,你也可以通过 $0 , $1 , $2 等名字来引用闭包的实际参数值. 如果你在闭包表达式中使用这些简写实际参数名,那么你可以在闭包的实际参数列表中忽略对 ...
- Swift闭包(Closure)
语法: { (parameters) ->return type in statements} 实例:采用函数实现: let names =["Chris", "A ...
- swift闭包传值
不知道原理,就知道这么用的,皮毛上的那一点. 寻思着把以前的项目改成swift的,结果了,,, 反向传值 一. //类似于OC中的typedef typealias sendValueClosure= ...
随机推荐
- 把python脚本打包成win可执行文件
前几天有个朋友找我写一点小东西,写好后把代码发他帮他搞了半天,结果愣是没听懂,就找到了这个办法. 1.导入pyinstaller包, pip install pyinstaller 2.进入到你需要打 ...
- apollo命令行传入参数
Java apollo客户端运行配置 需要在META-INF中创建app.properties文件,以配置app.id 还需要在/opt/settings/server.properties或C:/o ...
- CentOS 6.5 下安装redis
1.登录虚拟机后,直接输入命令:yum -y install redis 会出现一个错误: 是因为少了epel源, 2.运行:yum -y install epel-release 最后出现 Comp ...
- 剑指offer:从头到尾打印链表
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:从头到尾打印链表 题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路 首先题目实际给出的要求是返回ve ...
- java线程(7)——阻塞队列BlockingQueue
回顾: 阻塞队列,英文名叫BlockingQueue.首先他是一种队列,联系之前Java基础--集合中介绍的Queue与Collection,我们就很容易开始今天的阻塞队列的学习了.来看一下他们的接口 ...
- BZOJ2437 NOI2011兔兔与蛋蛋(二分图匹配+博弈)
首先将棋盘黑白染色,不妨令空格处为黑色.那么移动奇数次后空格一定处于白色格子,偶数次后空格一定处于黑色格子.所以若有某个格子的棋子颜色与棋盘颜色不同,这个棋子就是没有用的.并且空格与某棋子交换后,棋子 ...
- Hibernate查询语言——HQL
HQL(Hibernate Query Language)查询语言是完全面向对象的查询语言,它提供了更加面向对象的封装,可以理解如多态.继承和关联. HQL的基本语法如下: select " ...
- 51nod 1851俄罗斯方块(trick)
题目大意:给出一个黑白图,你可以选定一个俄罗斯方块的区域,黑白翻转,问能否变成白图 比较trick的题目, 首先可以想到,奇数个1肯定是无解的,所以考虑偶数个1 可以先讨论n是2的情况 当n为2时,其 ...
- clientWidth、clientHeight、offsetWidth、offsetHeight以及scrollWidth、scrollHeight
clientWidth.clientHeight.offsetWidth.offsetHeight以及scrollWidth.scrollHeight是几个困惑了好久的元素属性,趁着有时间整理一下 1 ...
- 【BZOJ 2460 元素】
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1555 Solved: 809[Submit][Status][Discuss] Descripti ...