Object-C--->Swift之(七)嵌套函数与闭包

简介: 嵌套函数函数分为全局函数和局部函数,前面已经介绍了全局函数,下面介绍下局部函数,定义在函数体内部的函数可以成为嵌套函数。 注意:嵌套函数对外是隐蔽的,只能在其封闭函数内有效,嵌套函数只能在其封闭函数内有效,其封闭函数也可以返回嵌套函数,以便于程序在其他作用域内使用嵌套函数。

嵌套函数

函数分为全局函数和局部函数,前面已经介绍了全局函数,下面介绍下局部函数,定义在函数体内部的函数可以成为嵌套函数。
注意:嵌套函数对外是隐蔽的,只能在其封闭函数内有效,嵌套函数只能在其封闭函数内有效,其封闭函数也可以返回嵌套函数,以便于程序在其他作用域内使用嵌套函数。

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函数,调用权利给mathFunc
print(mathFunc(5))调用cube函数,输出125
var 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 in
return val*val
}
print(square(5))
var result=(#base:Int,#exponent:Int)->Int in
var result = 1
for 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

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

相关文章
|
4月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
106 2
|
3月前
|
监控 API Swift
用Swift开发iOS平台上的上网行为管理监控软件
在当今数字化时代,随着智能手机的普及,人们对于网络的依赖日益增加。然而,对于一些特定场景,如家庭、学校或者企业,对于iOS设备上的网络行为进行管理和监控显得尤为重要。为了满足这一需求,我们可以利用Swift语言开发一款iOS平台上的上网行为管理监控软件。
213 2
|
4月前
|
监控 Swift iOS开发
局域网计算机监控软件中利用Swift构建iOS端的移动监控应用
在局域网计算机监控软件的开发中,构建iOS端的移动监控应用是一项关键任务。本文将介绍如何利用Swift语言实现这一目标,通过多个代码示例展示关键功能的实现。
225 1
|
4月前
|
安全 JavaScript 前端开发
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
77 0
|
6月前
|
JavaScript 前端开发 PHP
用swift开发ios移动端app应用初体验
直接跟着 apple 官方的 SwiftUI 教程跑的,写惯了 javascript 奔放的代码,很多语法理解起来还是有点费劲
60 1
|
8月前
|
Swift iOS开发
iOS OC混编Swift 后者无法走断点
iOS OC混编Swift 后者无法走断点
52 0
|
Swift iOS开发
IOS使用Swift加载Xib文件
IOS使用Swift加载Xib文件
271 0
|
Swift iOS开发
iOS开发 - 适合工程多环境切换(swift环境),适合经常打很多不同环境包的人
iOS开发 - 适合工程多环境切换(swift环境),适合经常打很多不同环境包的人
221 0
iOS开发 - 适合工程多环境切换(swift环境),适合经常打很多不同环境包的人
|
Swift 数据安全/隐私保护 iOS开发
iOS开发 - swift通过Alamofire实现https通信
iOS开发 - swift通过Alamofire实现https通信
351 0
iOS开发 - swift通过Alamofire实现https通信

相关课程

更多