• Swift使用闭包表达式


    Swift中的闭包表达式很灵活,其标准语法格式如下:
    { (参数列表) ->返回值类型 in
        语句组
    }
    其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是后面有in关键字。
    Swift提供了多种闭包简化写法,这一节我们将介绍几种不同的形式。
    1.类型推断简化
    类型推断是Swift的强项,Swift可以根据上下文环境推断出参数类型和返回值类型。以下代码是标准形式的闭包:
    {(a:Int, b:Int) -> Int in
        return a + b
    }
    Swift能推断出参数a和b是Int类型,返回值也是Int类型。简化形式如下:
    {a, b in return a + b }
    使用这种简化方式修改后的示例代码如下:

    [html] view plaincopy
     
    1. func calculate(opr :String)-> (Int,Int)-> Int {  
    2.   
    3.   
    4.     var result : (Int,Int)-> Int  
    5.       
    6.     switch (opr) {  
    7.     case "+" :  
    8.         result = {a, b in return a + b }        ①  
    9.     default:  
    10.         result = {a, b in return a - b }        ②  
    11.     }  
    12.     return result;  
    13. }  
    14.   
    15.   
    16. let f1:(Int,Int)-Int = calculate("+")  
    17. println("10 + 5 = (f1(10,5))")  
    18.   
    19.   
    20. let f2:(Int,Int)-Int = calculate("-")  
    21. println("10 + 5 = (f2(10,5))")  



    上述代码第①行和第②行的闭包是上一节示例的简化写法,其中a和b是参数,return后面是返回值。怎么样?很简单吧?
    2.隐藏return关键字
    如果在闭包内部语句组只有一条语句,如return a + b等,那么这种语句都是返回语句。前面的关键字return可以省略,省略形式如下:
    {a, b in a + b }
    使用这种简化方式修改后的示例代码如下:

    [html] view plaincopy
     
    1. func calculate(opr :String)-> (Int,Int)-> Int {  
    2.   
    3.   
    4.     var result : (Int,Int)-> Int  
    5.       
    6.     switch (opr) {  
    7.     case "+" :  
    8.         result = {a, b in return a + b }        ①  
    9.     default:  
    10.         result = {a, b in return a - b }        ②  
    11.     }  
    12.     return result;  
    13. }  




    上述代码第①行和第②行的闭包return关键字省略了,需要注意的是,省略的前提是闭包中只有一条return语句。下面这样有多条语句是不允许的。
    {a, b in var c; a + b }
    3.缩写参数名称
    上一节介绍的闭包表达式已经很简洁了,不过,Swift的闭包还可以再进行简化。Swift提供了参数名称缩写功能,我们可以用$0、$1、$2来表示调用闭包中参数,$0指代第一个参数,$1指代第二个参数,$2指代第三个参数,以此类推$n+1指代第n个参数。
    使用参数名称缩写,还可以在闭包中省略参数列表的定义,Swift能够推断出这些缩写参数的类型。此外,in关键字也可以省略。参数名称缩写之后如下所示:
    {$0 + $1}
    使用参数名称缩写修改后的示例代码如下:

    [html] view plaincopy
     
    1. func calculate(opr :String)-> (Int,Int)-> Int {  
    2.   
    3.   
    4.     var result : (Int,Int)-> Int  
    5.       
    6.     switch (opr) {  
    7.     case "+" :  
    8.         result = {$0 + $1}  ①  
    9.     default:  
    10.         result = {$0 - $1}  ②  
    11.     }  
    12.     return result;  
    13. }  
    14.   
    15.   
    16. let f1:(Int,Int)-Int = calculate("+")  
    17. println("10 + 5 = (f1(10,5))")  
    18.   
    19.   
    20. let f2:(Int,Int)-Int = calculate("-")  
    21. println("10 + 5 = (f2(10,5))")  



    上述代码第①行和第②行的闭包采用了参数名称缩写。
    4.使用闭包返回值
    闭包表达本质上是函数类型,是有返回值的,我们可以直接在表达式中使用闭包的返回值。重新修改add和sub闭包,示例代码如下:

    [html] view plaincopy
     
    1. let c1:Int = {(a:Int, b:Int) -> Int in  
    2.                 return a + b  
    3.           }(10,5)       ①  
    4.   
    5.   
    6. println("10 + 5 = (c1)")  
    7.   
    8.   
    9. let c2:Int = {(a:Int, b:Int) -> Int in  
    10.                     return a - b  
    11.                 }(10,5)     ②  
    12.   
    13.   
    14. println("10 - 5 = (c2)")  



    上述代码有两个表达式,第①行代码是给c1赋值,后面是一个闭包表达式。但是闭包表达式不能直接赋值给c1,因为c1是Int类型,需要闭包的返回值。这就需要在闭包结尾的大括号后面接一对小括号(10,5),通过小括号(10,5)为闭包传递参数。第②行代码也是如此。通过这种方法可以为变量和常量直接赋值,在有些场景下使用非常方便。

    更多内容请关注国内第一本Swift图书《Swift开发指南》
    本书交流讨论网站:http://www.51work6.com/swift.php
    欢迎加入Swift技术讨论群:362298485

     Swift中的闭包表达式很灵活,其标准语法格式如下:
    { (参数列表) ->返回值类型 in
        语句组
    }
    其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是后面有in关键字。
    Swift提供了多种闭包简化写法,这一节我们将介绍几种不同的形式。
    1.类型推断简化
    类型推断是Swift的强项,Swift可以根据上下文环境推断出参数类型和返回值类型。以下代码是标准形式的闭包:
    {(a:Int, b:Int) -> Int in
        return a + b
    }
    Swift能推断出参数a和b是Int类型,返回值也是Int类型。简化形式如下:
    {a, b in return a + b }
    使用这种简化方式修改后的示例代码如下:

    [html] view plaincopy
     
    1. func calculate(opr :String)-> (Int,Int)-> Int {  
    2.   
    3.   
    4.     var result : (Int,Int)-> Int  
    5.       
    6.     switch (opr) {  
    7.     case "+" :  
    8.         result = {a, b in return a + b }        ①  
    9.     default:  
    10.         result = {a, b in return a - b }        ②  
    11.     }  
    12.     return result;  
    13. }  
    14.   
    15.   
    16. let f1:(Int,Int)-Int = calculate("+")  
    17. println("10 + 5 = (f1(10,5))")  
    18.   
    19.   
    20. let f2:(Int,Int)-Int = calculate("-")  
    21. println("10 + 5 = (f2(10,5))")  



    上述代码第①行和第②行的闭包是上一节示例的简化写法,其中a和b是参数,return后面是返回值。怎么样?很简单吧?
    2.隐藏return关键字
    如果在闭包内部语句组只有一条语句,如return a + b等,那么这种语句都是返回语句。前面的关键字return可以省略,省略形式如下:
    {a, b in a + b }
    使用这种简化方式修改后的示例代码如下:

    [html] view plaincopy
     
    1. func calculate(opr :String)-> (Int,Int)-> Int {  
    2.   
    3.   
    4.     var result : (Int,Int)-> Int  
    5.       
    6.     switch (opr) {  
    7.     case "+" :  
    8.         result = {a, b in return a + b }        ①  
    9.     default:  
    10.         result = {a, b in return a - b }        ②  
    11.     }  
    12.     return result;  
    13. }  




    上述代码第①行和第②行的闭包return关键字省略了,需要注意的是,省略的前提是闭包中只有一条return语句。下面这样有多条语句是不允许的。
    {a, b in var c; a + b }
    3.缩写参数名称
    上一节介绍的闭包表达式已经很简洁了,不过,Swift的闭包还可以再进行简化。Swift提供了参数名称缩写功能,我们可以用$0、$1、$2来表示调用闭包中参数,$0指代第一个参数,$1指代第二个参数,$2指代第三个参数,以此类推$n+1指代第n个参数。
    使用参数名称缩写,还可以在闭包中省略参数列表的定义,Swift能够推断出这些缩写参数的类型。此外,in关键字也可以省略。参数名称缩写之后如下所示:
    {$0 + $1}
    使用参数名称缩写修改后的示例代码如下:

    [html] view plaincopy
     
    1. func calculate(opr :String)-> (Int,Int)-> Int {  
    2.   
    3.   
    4.     var result : (Int,Int)-> Int  
    5.       
    6.     switch (opr) {  
    7.     case "+" :  
    8.         result = {$0 + $1}  ①  
    9.     default:  
    10.         result = {$0 - $1}  ②  
    11.     }  
    12.     return result;  
    13. }  
    14.   
    15.   
    16. let f1:(Int,Int)-Int = calculate("+")  
    17. println("10 + 5 = (f1(10,5))")  
    18.   
    19.   
    20. let f2:(Int,Int)-Int = calculate("-")  
    21. println("10 + 5 = (f2(10,5))")  



    上述代码第①行和第②行的闭包采用了参数名称缩写。
    4.使用闭包返回值
    闭包表达本质上是函数类型,是有返回值的,我们可以直接在表达式中使用闭包的返回值。重新修改add和sub闭包,示例代码如下:

    [html] view plaincopy
     
    1. let c1:Int = {(a:Int, b:Int) -> Int in  
    2.                 return a + b  
    3.           }(10,5)       ①  
    4.   
    5.   
    6. println("10 + 5 = (c1)")  
    7.   
    8.   
    9. let c2:Int = {(a:Int, b:Int) -> Int in  
    10.                     return a - b  
    11.                 }(10,5)     ②  
    12.   
    13.   
    14. println("10 - 5 = (c2)")  



    上述代码有两个表达式,第①行代码是给c1赋值,后面是一个闭包表达式。但是闭包表达式不能直接赋值给c1,因为c1是Int类型,需要闭包的返回值。这就需要在闭包结尾的大括号后面接一对小括号(10,5),通过小括号(10,5)为闭包传递参数。第②行代码也是如此。通过这种方法可以为变量和常量直接赋值,在有些场景下使用非常方便。

    更多内容请关注国内第一本Swift图书《Swift开发指南》
    本书交流讨论网站:http://www.51work6.com/swift.php
    欢迎加入Swift技术讨论群:362298485

     关注智捷iOS课堂微信公共平台

  • 相关阅读:
    TinyMCE下载及使用
    正则表达式30分钟入门教程
    JQuery插件官网汇总
    析构函数和Dispose的使用区别
    SlidesJS基本使用方法和官方文档解释 【Jquery幻灯片插件 Jquery相册插件】
    SlidesJS基本使用方法和官方文档解释 【Jquery幻灯片插件 Jquery相册插件】
    jQuery .tmpl(), .template()学习
    IIS请求筛选模块被配置为拒绝超过请求内容长度的请求
    前端小技巧
    CKEditor图片上传实现详细步骤(使用Struts 2)
  • 原文地址:https://www.cnblogs.com/iOS-Blog/p/3956826.html
Copyright © 2020-2023  润新知