swift中闭包的学习。
在swift中的闭包等同于OC中的block,它的用途就是在于可以包装一段代码在必要的时候进行调用。
闭包定义:
{(类型列表) -> 返回值 in
// 多条swift语句
// 执行代码 insert coding
}
实际创建闭包代码如下:
var square = {(value1 value1:Int,value2 value2:Int)->Int in
// 代码块
if value1>value2{
return value1
}
return value2
}
注释: 1.此处我们定义一个 square的变量,该变量的类型可以通过闭包的返回值类型进行推导,通过代码得出square的类型为(Int,Int)->Int类型。
2.这段闭包代码的意义是 比较两个数的大小,将最大的那个数返回,并赋值给square
3. 注意闭包中的参数名,如果不定义外部参数名,当我们调用的时候是不会有任何的提示(xcode 7.2,也许版本高了之后会有改进吧,毕竟现在xcode在写swift很多提示都不给出),如果我们给两个参数提供外部名时,当我们调用这个闭包的时候系统会给出提示。
调用闭包代码如下:
var max = square(value1: , value2: )
print(max)
一个完整的闭包表达式是需要定义 形参类型,返回值类型,但是由于在swift中可以根据上下文进行推导参数类型,所以当变量确定类型时,闭包中的新参类型和返回值类型可以省略:
var square1:(Int,Int)->Int = {(value1,value2) in (value1 > value2 ? value1 : value2)
}
注释:1.这段代码初学者可能看着比较费劲,可能不理解(Int,Int)->Int 是什么,它其实就是一个类型,是闭包的类型,这段代码实则就是将闭包中的类型全部写到了变量类型定义处了。初学者在练习的时候可以按照规范进行编写,等熟练的时候可以看这段代码,现在只是作为了解。
2.另外,可以看到 此处的返回值省略了return ,当代码执行体有且只有一行代码的时候,可以将其省略。
3.还可以省略形参名,如果闭包表达式省略了形参名 那么 in 关键值也是可以省略的。此时闭包表达式用 $0 $1 $2...名字来一用第一个、第二个、第三个形参。
闭包可以捕获上下文中的常量和变量
闭包可以访问或修改其所在的上下文中的变量或常量(常量只可以访问,不可以修改),这个过程称之为捕获。即便定义的这些变量或常量的作用域已经不存在了,但是闭包依然可以访问或修改它们。
程序如下
// 定义一个函数,该函数的返回值类型为:()->[String]
func makeArray(ele:String)->()->[String]
{
// 定义一个数组,该数组不包含任何元素
var arr:[String] = []
// 定义一个嵌套方法,该方法返回一个String数组
func addElement()->[String]
{
// 在arr数组中添加一个ele的元素
arr.append(ele)
return arr
} return addElement }
注释:由上面程序可以看出在arrElement()中没有定义任何的参数和变量,但是依然可以访问到arr 和 ele 这是因为它通过上下文捕获到在其所在上下文存在这两个变量或参数,所以arrElement()在没有定义的情况下可以取到.
swift中闭包的学习。的更多相关文章
- Swift: 比较Swift中闭包传值、OC中的Block传值
一.介绍 开发者对匿名函数应该很清楚,其实它就是一个没有名字的函数或者方法,给人直观的感觉就是只能看到参数和返回值.在iOS开发中中,它又有自己的称呼,在OC中叫Block代码块,在Swift中叫闭包 ...
- swift中闭包的循环引用
首先我们先创造一个循环引用 var nameB:(()->())? override func viewDidLoad() { super.viewDidLoad() let bu = UIBu ...
- [Swift]UIAlertController 以及 Swift 中的闭包和枚举
原文地址:http://blog.callmewhy.com/2014/10/08/uialertcontroller-swift-closures-enum/ 在 iOS8 的 SDK 中, UIK ...
- Swift 中的利刃,函数和闭包
input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...
- iOS - Swift Closure 闭包
1.Closure 闭包在 Swift 中非常有用.通俗的解释就是一个 Int 类型里存储着一个整数,一个 String 类型包含着一串字符,同样,闭包是一个包含着函数的类型.有了闭包,你就可以处理很 ...
- Swift中的Weak Strong Dance
亲爱的博客园的关注着博主文章的朋友们告诉你们一个很不幸的消息哦, 这篇文章将会是博主在博客园发表的最后一篇文章咯, 因为之后的文章博主只会发布到这里哦 http://daiweilai.github. ...
- Swift:闭包(Closures)
一. 基本概念 闭包(Closures)是自包括的功能代码块,能够在代码中使用或者用来作为參数传值. 在Swift中的闭包与C.OC中的blocks和其他编程语言(如C#)中的lambda, java ...
- Swift之闭包
swift中闭包是一个非常强大的东西,闭包是自包括的函数代码块,能够在代码中被传递和使用.跟C 和 Objective-C 中的代码块(blocks)非常相似 .这个大家必须掌握!必须掌握! 必须掌握 ...
- swift中block的使用
在OC中习惯用block来传值,而swift中,block被重新定义了一下,叫闭包: 使用的技巧:谁定义谁传值: 案例使用A.B控制器: 1~4步在B中执行,最后在A中执行: - B控制器: 1- ...
随机推荐
- BZOJ2213[Poi2011]Difference——DP
题目描述 A word consisting of lower-case letters of the English alphabet ('a'-'z') is given. We would li ...
- BZOJ4569 SCOI2016萌萌哒(倍增+并查集)
一个显然的暴力是用并查集记录哪些位之间是相等的.但是这样需要连nm条边,而实际上至多只有n条边是有用的,冗余过多. 于是考虑优化.使用类似st表的东西,f[i][j]表示i~i+2^j-1与f[i][ ...
- xslt格式化日期的方法
数据:<PK_SEND_DATE>2007-9-28 0:00:00</PK_SEND_DATE> 通过截取:<xsl:value-of select="sub ...
- UOJ#192. 【UR #14】最强跳蚤
题目链接 http://uoj.ac/problem/192 暑期课第二天 树上问题进阶 具体内容看笔记博客吧 题意 n个节点的树T 边有边权w 求满足(u, v)上所有边权乘积为完全平方数的路径有多 ...
- 洛谷 P1984 [SDOI2008]烧水问题 解题报告
P1984 [SDOI2008]烧水问题 题目描述 把总质量为1kg的水分装在n个杯子里,每杯水的质量均为(1/n)kg,初始温度均为0℃.现需要把每一杯水都烧开.我们可以对任意一杯水进行加热.把一杯 ...
- Asp: Server.mapPath() 注意事项
今天下午,在删除一个用户后,竟然发现该用户上传的图片还能正常显示. 郁闷了,怎么会这样? 为了再次验证这个结果,我新注册一个用户名,然后上传3张图片,接着删除这个用户,再查看刚刚上传的3张图片,竟然没 ...
- react组件在项目中的应用(基础知识)
上图我是定义了5个模块,全部都渲染在一个组件里面.可以先看看我的代码结构 我将Hello文件夹下的index.jsx文件作为父组件,最后渲染在根组件中. 那我们怎么输出这个Hello组件呢?要达到上图 ...
- 自动清理MySQL binlog日志
开启MySQL binlog日志的服务器,如果不设置自动清理日志,默认binlog日志一直保留着,时间一长,服务器磁盘空间被binlog日志占满,导致MySQL数据库出错. 使用下面方法可以安全清理b ...
- MySQL中双NDBD节点Cluster快速配置
是MySQL适合于分布式计算环境的高实用.高冗余版本.它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器.在MyQL 5.0及以上的二进制版本中.以及与最 ...
- RegExp 对象
什么是 RegExp? RegExp 是正则表达式的缩写. 当您检索某个文本时,可以使用一种模式来描述要检索的内容.RegExp 就是这种模式. 简单的模式可以是一个单独的字符. 更复杂的模式包括了更 ...