在swift中的闭包等同于OC中的block,它的用途就是在于可以包装一段代码在必要的时候进行调用。

  闭包定义:    

   {(类型列表) -> 返回值 in

// 多条swift语句

    // 执行代码  insert coding

}

  实际创建闭包代码如下:

  1. var square = {(value1 value1:Int,value2 value2:Int)->Int in
  2. // 代码块
  3. if value1>value2{
  4. return value1
  5. }
  6. return value2
  7.  
  8. }

  注释: 1.此处我们定义一个 square的变量,该变量的类型可以通过闭包的返回值类型进行推导,通过代码得出square的类型为(Int,Int)->Int类型。

      2.这段闭包代码的意义是 比较两个数的大小,将最大的那个数返回,并赋值给square

      3. 注意闭包中的参数名,如果不定义外部参数名,当我们调用的时候是不会有任何的提示(xcode 7.2,也许版本高了之后会有改进吧,毕竟现在xcode在写swift很多提示都不给出),如果我们给两个参数提供外部名时,当我们调用这个闭包的时候系统会给出提示。

  调用闭包代码如下:

  

  1. var max = square(value1: , value2: )
  2. print(max)

    一个完整的闭包表达式是需要定义 形参类型,返回值类型,但是由于在swift中可以根据上下文进行推导参数类型,所以当变量确定类型时,闭包中的新参类型和返回值类型可以省略:

  1. var square1:(Int,Int)->Int = {(value1,value2) in (value1 > value2 ? value1 : value2)
  2. }

  注释:1.这段代码初学者可能看着比较费劲,可能不理解(Int,Int)->Int 是什么,它其实就是一个类型,是闭包的类型,这段代码实则就是将闭包中的类型全部写到了变量类型定义处了。初学者在练习的时候可以按照规范进行编写,等熟练的时候可以看这段代码,现在只是作为了解。

     2.另外,可以看到 此处的返回值省略了return ,当代码执行体有且只有一行代码的时候,可以将其省略。

     3.还可以省略形参名,如果闭包表达式省略了形参名 那么 in 关键值也是可以省略的。此时闭包表达式用 $0 $1 $2...名字来一用第一个、第二个、第三个形参。

  闭包可以捕获上下文中的常量和变量

    闭包可以访问或修改其所在的上下文中的变量或常量(常量只可以访问,不可以修改),这个过程称之为捕获。即便定义的这些变量或常量的作用域已经不存在了,但是闭包依然可以访问或修改它们。

  程序如下

  1. // 定义一个函数,该函数的返回值类型为:()->[String]
  2. func makeArray(ele:String)->()->[String]
  3. {
  4. // 定义一个数组,该数组不包含任何元素
  5. var arr:[String] = []
  6. // 定义一个嵌套方法,该方法返回一个String数组
  7. func addElement()->[String]
  8. {
  9. // 在arr数组中添加一个ele的元素
  10. arr.append(ele)
  11. return arr
  12. }
  13.  
  14. return addElement
  15.  
  16. }

  注释:由上面程序可以看出在arrElement()中没有定义任何的参数和变量,但是依然可以访问到arr 和 ele 这是因为它通过上下文捕获到在其所在上下文存在这两个变量或参数,所以arrElement()在没有定义的情况下可以取到.

swift中闭包的学习。的更多相关文章

  1. Swift: 比较Swift中闭包传值、OC中的Block传值

    一.介绍 开发者对匿名函数应该很清楚,其实它就是一个没有名字的函数或者方法,给人直观的感觉就是只能看到参数和返回值.在iOS开发中中,它又有自己的称呼,在OC中叫Block代码块,在Swift中叫闭包 ...

  2. swift中闭包的循环引用

    首先我们先创造一个循环引用 var nameB:(()->())? override func viewDidLoad() { super.viewDidLoad() let bu = UIBu ...

  3. [Swift]UIAlertController 以及 Swift 中的闭包和枚举

    原文地址:http://blog.callmewhy.com/2014/10/08/uialertcontroller-swift-closures-enum/ 在 iOS8 的 SDK 中, UIK ...

  4. Swift 中的利刃,函数和闭包

    input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...

  5. iOS - Swift Closure 闭包

    1.Closure 闭包在 Swift 中非常有用.通俗的解释就是一个 Int 类型里存储着一个整数,一个 String 类型包含着一串字符,同样,闭包是一个包含着函数的类型.有了闭包,你就可以处理很 ...

  6. Swift中的Weak Strong Dance

    亲爱的博客园的关注着博主文章的朋友们告诉你们一个很不幸的消息哦, 这篇文章将会是博主在博客园发表的最后一篇文章咯, 因为之后的文章博主只会发布到这里哦 http://daiweilai.github. ...

  7. Swift:闭包(Closures)

    一. 基本概念 闭包(Closures)是自包括的功能代码块,能够在代码中使用或者用来作为參数传值. 在Swift中的闭包与C.OC中的blocks和其他编程语言(如C#)中的lambda, java ...

  8. Swift之闭包

    swift中闭包是一个非常强大的东西,闭包是自包括的函数代码块,能够在代码中被传递和使用.跟C 和 Objective-C 中的代码块(blocks)非常相似 .这个大家必须掌握!必须掌握! 必须掌握 ...

  9. swift中block的使用

    在OC中习惯用block来传值,而swift中,block被重新定义了一下,叫闭包: 使用的技巧:谁定义谁传值:   案例使用A.B控制器: 1~4步在B中执行,最后在A中执行: - B控制器: 1- ...

随机推荐

  1. ajax 调用 java webapi 多个参数(二)

    第一种方法:http://blog.csdn.net/hanjun0612/article/details/74436273 附上另一种解决方法. 这个方法主要针对  嵌套模型(模型中含有模型)的ap ...

  2. 【转】Linux常用命令

    日常操作命令 查看当前所在的工作目录的全路径 pwd 12 [root@localhost ~]# pwd/root 查看当前系统的时间 date 12345678 [root@localhost ~ ...

  3. 洛谷 P1691 有重复元素的排列问题 解题报告

    P1691 有重复元素的排列问题 题目描述 设\(R={r_1,r_2,--,r_n}\)是要进行排列的\(n\)个元素.其中元素\(r_1,r_2,--,r_n\)可能相同.使设计一个算法,列出\( ...

  4. android + eclipse + 后台静默安装(一看就会)

      首先要说到三个类. import android.content.pm.IPackageInstallObserver; import android.content.pm.IPackageIns ...

  5. HDU 1074 Doing Homework (动态规划,位运算)

    HDU 1074 Doing Homework (动态规划,位运算) Description Ignatius has just come back school from the 30th ACM/ ...

  6. Sublime Text3—常用插件Emmet

    摘要 安装请看上一篇Sublime Text-安装,和sublime自带快捷键一起用,写html简直快的飞起. 下面整理的是常用的,完整的可看emmet官方文档. 一.生成标签 1.快速生成文档结构 ...

  7. 中文参考文献如何导入到endnote中

    比如我想在文献中插入“2型糖尿病患者并发脑卒中的前瞻性研究”这篇参考文献,在主题里面输入文献标题,勾选我们要找的文献,点击“导出/参考文献” 导出来以后,点击屏幕右下角界面的“导出/参考文献”,下图红 ...

  8. IDEA进行远程调试

    biz-test本地调用测试环境01机器上面的needle项目,卡在查询数据库的地方(Jade停住不走了) 首先配置 相关项目 的服务器端部署jvm参数: 在needle的config.pp.temp ...

  9. 初级BFS

    输入:n个顶点,m条边. 接下来输入每一条边的两个顶点. 输出遍历的顺序 #include<iostream> #include<queue> ];//bool mark[10 ...

  10. CentOS 7 系统的初化始配置

    安装好CentOS7系统后我们要进行初始设置来让我们的服务器方便管理与使用,但是发现在7以前的版本都能输入的命令不能输入了,去官网查查才发发生了很大的变化,关于有哪些变化的可以点击这里查看,初始配置的 ...