美文网首页
每天学一点Swift----闭包(一)

每天学一点Swift----闭包(一)

作者: 冯可乐同学 | 来源:发表于2017-05-20 21:58 被阅读13次

    五.嵌套函数

    1. Swift还支持在函数体内定义函数,这种在函数体内定义的函数称为嵌套函数

    2.默认情况下,嵌套函数对外部是隐藏的。嵌套函数只能在其封闭函数内有效,其封闭函数也可以返回嵌套函数类型,以便程序在其他作用域中使用嵌套函数。----举个栗子:重新改写得到square函数或其他函数的例子

    //定义函数,该函数的返回值类型为(Int)-> Int

    func getMathFunc(#type : String) -> (Int) -> Int

    {

    //定义一个计算平方的函数

    func square(val : Int) -> Int

    {

    return val * val

    }

    //定义计算立方的函数

    func cube(val : Int) -> Int

    {

    return val * val * val

    }

    //定义一个计算阶乘的函数

    func factorial(val : Int) -> Int

    {

    int result = 1;

    for index in 2...val

    {

    result *= index

    }

    return result

    }

    //该函数返回的是嵌套函数

    switch(type)

    {

    case "square":

    return square

    case "cube":

    return cube

    default:

    retun factorial

    }

    }

    //调用函数getMathFunc后,该函数返回的是一个函数

    var fun1 = getMathFunc(type : "square") //得到square函数

    var fun2 = getMathFunc(type : "cube") //得到cube函数

    var fun3 = getMathFunc(type : "other") //得到factorial函数

    六.嵌套函数与闭包

    1.闭包是现代编程语言争相引入的一种语法,如果说函数是命名,方便复用的代码块,那么闭包则是功能更灵活的代码块,它可以在程序中被传递和调用。

    2. swift中的闭包类似于Objective-C中的代码块和Java、c#中的Lambda表达式。

    3.从另一个角度看,函数也可以被当成闭包进行处理:

    (1)全局函数是一个有名称、但不会捕获任何值的闭包

    (2)嵌套韩式是一个有名字、可以捕获封闭函数体的值的闭包

    (3)闭包表达式则是一个简洁的、可以捕获封闭函数体的值的匿名闭包。

    4.回顾嵌套函数;

    对于第五点中的嵌套函数来说,3个嵌套函数的函数名的作用域仅仅就是在switch中,一旦离开了getMathFunc函数后,3个嵌套函数的函数名就没有用了。既然嵌套函数的函数名没有太大的意义,那么就可以考虑使用闭包表达式来简化嵌套函数的写法。

    5.使用闭包表达式代替嵌套函数。举个栗子:对上面的例子进行修改

    func getMathFunc(#type : String) -> (Int) -> Int

    {

    //该函数返回的是闭包

    switch(type)

    {

    case "square":

    return {(val : Int) -> Int in //****使用in来代替了原来的函数的大括号

    return val * val

    }

    case "cube":

    return { (val : Int) -> Int in

    return val * val * val

    }

    default:

    return { (val : Int) -> Int in

    var result = 1

    for index in 2...val

    {

    result *= index

    }

    return result

    }

    }

    }

    可以看出,在两次的switch代码块中,除了在声明函数格式那里不同之外,函数体内的代码块和闭包表达式内的代码块是完全相同的。

    6.定义闭包和嵌套函数只是存在如下3点区别:

    (1)定义闭包不需要func关键字,不需要指定函数名

    (2)定义闭包需要使用关键字in来代替函数的大括号

    (3)定义闭包的第一个花括号要移到形参列表的圆括号之前

    相关文章

      网友评论

          本文标题: 每天学一点Swift----闭包(一)

          本文链接:https://www.haomeiwen.com/subject/slapxxtx.html