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

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

相关文章
|
7月前
|
前端开发 Java 编译器
Object c/swift,java,c/c++在32位和64位各个平台上基本数据类型 所占有的字节数
Object c/swift,java,c/c++在32位和64位各个平台上基本数据类型 所占有的字节数
50 0
|
Swift
Swift - pods中导入的Object-C文件在桥接文件中写入找不到的问题
Swift - pods中导入的Object-C文件在桥接文件中写入找不到的问题
152 0
|
程序员 iOS开发
Object-C与Swift混合开发
Object-C作为Apple的iOS App开发语言服务了许多个年头,2014年Apple推出了新的编程语言Swift,更高效更安全的口号再次吸引了一大批非iOS开发程序员进入,小编认为Swift取代Object-C只是时间问题,在神州这片土地上,毕竟技术普及有些落后,但再有两年左右时间Swift产品链将形成,第三方支持框架逐步完善,Swift必将成为iOS开发主流。
767 0
|
存储 Swift
Object-C--->Swift之(十一)属性观察者
属性观察者机制能让程序在属性被赋值时获得执行代码的机会,用来监视属性的除初始化之外的属性值变化,当属性值发生改变时可以对此作出响应 具体包括两个特殊的回调方法: willSet(newValue):被观察的属性即将被赋值之前自动调用方法。
715 0
|
存储 Spring Swift
Object-C--->Swift之(十)存储属性
计算属性相当于Object-C的getter、setter合成的属性,在Swift中结构体、类都可以定义计算属性 定义计算属性 [修饰符] var 计算属性名:属性类型{ get{ //getter方法执行体,该方法必须有返回值 } [set(形参名) {...
801 0
|
存储 Swift
Object-C--->Swift之(九)延迟存储属性
Swift引入了一种新的机制–延迟存储属性机制,在第一次被调用时才会被计算初始值的属性,声明时需要使用lazy修饰符。 注意:定义属性时一定得是变量(var),常量是无法使用延迟存储机制。
715 0
|
存储 程序员 Swift
Object-C--->Swift之(八)类和结构体
在Swift中类和结构体有高度的相似性。二者主要区别是: 1. 结构体不支持继承 2. 结构体不支持定义析构器 3. 结构体是值类型,而类是引用类型 定义类语法格式: [修饰符]class 类名 { 零个到多个构造器 零个到多个属性 零个到多个方法 零个到多个下标 } 对一个类定义而言,包括3种最常见的成员:构造器、属性、方法,如果程序员没有为一个类提供构造器,则系统会为该类提供一个默认、无参数的构造器。
829 0
|
网络架构 iOS开发 Swift
Object-C--->Swift之(七)函数重载
是什么是函数重载? 名字相同的函数出现在一起,就构成了函数重载,只要形参列表或者返回值类型不同就行。 判断条件 形参列表、 返回值类型组成、 外部形参名 三者其中一种不一样均可作为函数重载 举例说明 //该函数类型为()->Void fu...
704 0
|
Swift
Object-C--->Swift之(六)函数类型
认识函数类型 每个函数都有特定的函数类型 函数类型是由函数的形参类型、->和返回值类型组成。 例如: func Add(a:Int,b:Int){ ... } 该函数的函数类型为(Int,Int)->Void或者(Int,Int)->() func Add()->Int{ .
588 0