博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift开发笔记2.浅谈闭包
阅读量:6074 次
发布时间:2019-06-20

本文共 1691 字,大约阅读时间需要 5 分钟。

一门计算机语言要支持闭包,需要有两个前提:

1.支持函数类型,能够将函数作为参数或返回值传递。

2.支持函数嵌套。

这两个前提在Swift中都是满足的,下面展示一个函数嵌套

func cal(opr :String)->(Int,Int)->Int {    func add(a: Int,b: Int)->Int{    return a + b    }    func sub(a: Int,b: Int)->Int{        return a - b    }    var result : (Int, Int)->Int    switch (opr){    case "+" :    result = sub    case "-" :        result = sub    default :        result = add    }    return result}let f3:(Int,Int)-> Int = cal("+")println("10 + 5 = \(f1(10,5))")let f4:(Int,Int)-> Int = cal("-")println("10 - 5 = \(f2(10,5))")
我们在playground中,看到运行结果如图:

在Swift中可以用一下代码替代上面的嵌套函数:

func calculate(opr :String)-> (Int,Int)-> Int {        var result : (Int,Int)-> Int        switch (opr) {    case "+" :        result = {(a:Int, b:Int) -> Int in            return a + b        }    default:        result = {(a:Int, b:Int) -> Int in            return a - b        }    }    return result;}let f1:(Int,Int)-> Int = calculate("+")println("10 + 5 = \(f1(10,5))")let f2:(Int,Int)-> Int = calculate("-")println("10 - 5 = \(f2(10,5))")
运行效果:

上面的代码就是Swift中的闭包表达式,闭包是自包含的匿名函数代码块,可以作为表达式、函数参数和函数返回值,闭包表达式的运算结果是一种函数类型。Swift中的闭包表达式可以捕获其所在上下文环境中的常量和变量。这种引用事实上会引起比较麻烦的内存管理问题,好在Swift不需要程序员管理内存。

Swift中的闭包标准格式语法如下:

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

语句组

}

类型推断是Swift得强项,Swift可以根据上下文语境推断出参数类型和返回值类型,简化的形式如下:

{(a,b) in return a+b}
如果在闭包中只有一条语句,比如return a + b等,name这种语句都是返回语句前面的关键字return可以省略,省略后的格式如下:

{(a,b)in a+b}
现在闭包表达式的语句已经很简化了,但是可以更简化。Swift提供了参数名称缩写的功能,我们可以用$0、$1来调用闭包中的参数,$0指第一个参数,$1指第二个参数。使用了参数名称缩写的功能,还可以在闭包中省略参数列表的定义,Swift能够推断出这些参数列表的定义。此外,in关键字也可以省略,缩写后的格式如下:

{$0+$1}
闭包表达式本质上是函数类型,是有返回值的,我们可以在表达式中使用闭包的返回值。

let c1:Int = {$0 + $1}(10,5)println("10+5= \(c1)")
在以上代码中,闭包表达式不能直接赋值给c1,因为c1是Int,需要闭包的返回值。通过(10,5)为闭包传值。
你可能感兴趣的文章
(7)javascript的程序控制结构及语句------(2)循环控制语句、跳转语句、对话框...
查看>>
asp.net上传图片
查看>>
如何修改EF的代码生成策略
查看>>
Yii2.0实现语言包切换功能
查看>>
寒假的Java学习笔记总结1
查看>>
C#判断操作系统的位数
查看>>
利用a标签自动解析URL
查看>>
堆,栈,字符串池,以及进程,线程浅谈内存(个人理解)
查看>>
sql语句(Mysql数据库)
查看>>
面向对象小练习
查看>>
Javaweb学习笔记——(二)——————CSS概述,进入JavaScript
查看>>
关于JDBC技术中,调用MySQL中不建议在没有服务器身份验证的情况下建立SSL连接错误解决...
查看>>
寻仙——向中国味表白
查看>>
error this is not a media message!!!
查看>>
JavaWeb网上图书商城完整项目--day02-15.登录功能流程分析
查看>>
mysql性能优化总结(MySql避免重复插入记录的几种方法)
查看>>
vi命令使用技巧及经常出现的错误、etc目录下重要文件、环境变量及别名功能...
查看>>
面试官问你“有什么问题问我吗?”,你该如何回答?
查看>>
这么好的平台,居然荒废了这么久没使用,以后要常来!
查看>>
Rails
查看>>