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- ...
随机推荐
- Web Scraper爬取就是这么简单
这应该是最全的一个文档了 https://www.jianshu.com/p/e4c1561a3ea7 所以我就不介绍了,大家直接看就可以了,有问题可以提出来,我会针对问题对文章进行补充~
- A Plug for UNIX POJ - 1087(模板题 没啥好说的。。就用了一个map)
题意: 几种插头,每一种都只有一个,但有无限个插头转换器,转换器(a,b) 意味着 可以把b转换为a,有几个设备,每个设备对应一种插头,求所不能匹配插头的设备数量 这个题可以用二分图做 , 我用的是最 ...
- 【BZOJ2208】[JSOI2010]连通数(Tarjan)
[BZOJ2208][JSOI2010]连通数(Tarjan) 题面 BZOJ 洛谷 题解 先吐槽辣鸡洛谷数据,我写了个\(O(nm)\)的都过了. #include<iostream> ...
- Shell基础知识(一)
教程链接:shell从入门到入门 这个网站还有其他教程,可以尝试下看看. 普及类文章:bash/cmd/dos之间有什么区别与联系 >> bash是Linux下的一个shell应用程序 ...
- [WF2012]infiltration
[WF2012]infiltration 完全图 最多选择logn个点(下取整)(每选择一个点覆盖至少一半的规模) 暴力O(75^5)(不严格)枚举+bitset (随机化也可过) #include& ...
- (转)Maven之自定义archetype生成项目骨架
背景:最近在开发一个项目的基础构件,在以后项目的开发过程中可以直接使用该构件快速的生成项目骨架进行开发. 摘要:使用过Maven的人都知道maven中有许多功能都是通过插件来提供的,今天我们来说一下其 ...
- 邮件发送-》http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256
昨天使用发送邮件报了一个错 http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256 主 ...
- models.DateTimeField(auto_now_add=True) 与 models.DateTimeField(auto_now=True)
DateTimeField和DateField和TimeField存储的内容分别对应着datetime(),date(),time()三个对象. 对于auto_now=False和auto_now_a ...
- Java_myBatis_一对多映射
例如我们有需求需要实现以下查询 "一个用户对多条订单编号": select user.*,o.number,o.createtime from user left JOIN or ...
- 特征选取1-from sklearn.feature_selection import SelectKBest
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...