博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Object-C--->Swift之(七)嵌套函数与闭包
阅读量:6295 次
发布时间:2019-06-22

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

嵌套函数

函数分为全局函数和局部函数,前面已经介绍了全局函数,下面介绍下局部函数,定义在函数体内部的函数可以成为嵌套函数。

注意:嵌套函数对外是隐蔽的,只能在其封闭函数内有效,嵌套函数只能在其封闭函数内有效,其封闭函数也可以返回嵌套函数,以便于程序在其他作用域内使用嵌套函数。

func Math(#type:String)->(Int)->Int{ func square(val:Int)->Int {  return val*val}  func cube(val:Int)->Int  {    return val*val*val  }  switch(type)  {    case "square":    return square    case "cube":    return cube    default:    print("没有该函数")  }}var mathFunc=Math(type:"cube")//先得到cube函数,调用权利给mathFuncprint(mathFunc(5))调用cube函数,输出125var mathFunc=Math(type:"square")//先得到square函数,调用权利给mathFunc print(mathfunc(5))调用square函数,输出25

闭包

闭包是一种新的语法,跟Object-C的代码块一样,更加灵活性。

其实函数也可以算的上闭包处理

* 全局函数是一个有名称、但不会捕捉任何值的闭包。* 嵌套函数是一个有名字、可以捕获封闭函数体的值的闭包。* 闭包表达式是一个简单的、可以捕获封闭函数体的值的匿名闭包。    func Math(#type:String)->Int->Int    {     switch(type)     {     case "square":     return {(val:Int)->Int in      return val*val  }     case "cube":     return {(val:Int)->Int in     return val*val*val     }     default:       print("没有该函数")         }        }    var mathFunc=Math(type:"cube")    print(mathFunc(5))

闭包与嵌套函数存在的区别

* 定义闭包无须func关键字,无须制定函数名。
* 定义闭包需要额外使用in关键字。
* 定义闭包的第一个花括号要移到形参列表的圆括号之前。
标准语法如下:

{    (形参列表)->返回值类型 in    //核心代码     }

闭包的本质是更加灵活的代码块,因此完全可以将闭包赋值给变量或直接调用闭包。

var square={(val:Int)->Int inreturn val*val}print(square(5))var result=(#base:Int,#exponent:Int)->Int invar result = 1for i in 1...exponent{ result *=base}return result}(4,3)print(result)

上面两个闭包函数,第一个是先声明再调用,第二个是声明后直接调用

注意目前Swft中闭包的外部形参名没有任何意义。

几种简化方法

省略形参列表、返回值类型

//使用闭包表达式,由于程序定义square变量的类型
//所以swift可以推断闭包表达式的形参列表、返回值类型

var square:(Int)->Int ={(var) in return val*val}

//省略形参类型后,也可省略形参列表的圆括号,即可简化成

var square:(Int)->Int={var in return val*val}print(square(5))//输出25省略return

如果闭包表达式只有一行代码,并且这行代码的返回值将作为闭包表达式的返回值,那么可以省略

转载地址:http://mytta.baihongyu.com/

你可能感兴趣的文章
让人抓头的Java并发(一) 轻松认识多线程
查看>>
从源码剖析useState的执行过程
查看>>
地包天如何矫正?
查看>>
中间件
查看>>
Android SharedPreferences
查看>>
css面试题
查看>>
Vue组建通信
查看>>
用CSS画一个带阴影的三角形
查看>>
前端Vue:函数式组件
查看>>
程鑫峰:1.26特朗.普力挺美元力挽狂澜,伦敦金行情分析
查看>>
safari下video标签无法播放视频的问题
查看>>
01 iOS中UISearchBar 如何更改背景颜色,如何去掉两条黑线
查看>>
对象的继承及对象相关内容探究
查看>>
Spring: IOC容器的实现
查看>>
Serverless五大优势,成本和规模不是最重要的,这点才是
查看>>
Nginx 极简入门教程!
查看>>
iOS BLE 开发小记[4] 如何实现 CoreBluetooth 后台运行模式
查看>>
Item 23 不要在代码中使用新的原生态类型(raw type)
查看>>
为网页添加留言功能
查看>>
JavaScript—数组(17)
查看>>