温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Swift函数闭包

发布时间:2020-07-22 09:02:05 来源:网络 阅读:624 作者:hehemmm 栏目:移动开发

一、闭包的概念


    计算机语言要支持闭包的前提条件有2个:

    1、支持函数类型,能够将函数作为参数或返回值传递;

    2、支持函数嵌套


    示例:


    func caculate(opr : String)->(Int,Int)->Int {

                var result:(Int,Int)->Int

                switch(opr){

            case "+":

                result={(a:Int,b:Int)->Int in 

            return a+b

}

            default:

                result = {(a:Int,b:Int) -> Int in

                    return a - b

}


}

    return result;

}


let f1:(Int,Int)->Int = caculate("+")


println(f1(2,5))


    通过以上示例,我们可以给Swift的闭包一个定义:闭包是自包含的匿名函数块,可以作为表达式,函数参数和函数返回值,闭包表达式的运算结果是一种函数类型


    Swift的闭包类似于C和Obeject-C的代码库,C++和C#的Lamba表达式,JAVE中的内部匿名类



二、闭包的表达式


    Swift中的闭包表达式的标准写法如下:


    {(参数列表)->返回值类型 in 语句组}


    1、类型推断简化

        Swift中可以根据上下文环境推断出参数类型和参数返回值,以下代码是标准形式的闭包:


        {(a : Int, b : Int)-> Int in 

            return a + b

}

        Swift能推断出参数a和b为Int类型,返回值为Int类型,简化形式如下:


    {a,b in return a + b}        



    2、隐藏return关键字

        如果在闭包的内部语句组只有一条语句,如 rerturn a + b,那么这种语句都是返回语句,前面的关键字rerturn可以省略,省略形式如下:


    {a,b in a + b}



    3、缩写参数名称

        

        Swift提供了参数名称缩写的功能,我们可以用$0,$1,$2,表示调用闭包中的函数,$0表示第一个参数,$1表示第二个参数,以此类推


    func caculate(opr : String)->(Int,Int)->Int {

            var result:(Int,Int)->Int

            swtich opr{

            case "+":

            result={$1,$2}

            default:

            result={$1-$2}

}

            return result

}

        


    4、使用闭包返回值


            闭包表达式本质上是函数类型,是有返回值的,可以在表达式中直接使用闭包的返回值

        

            let c1 :Int = {(a:Int,b:Int)->Int in return a+b}(10,5)

            println(c1)


三、使用尾随闭包


        闭包表达式可以作为函数的参数传递,闭包必须是最后一个参数的时候才能使用


        示例:

        func caculate(opr : String,funcN:(Int,Int)->Int){
                switch opr{
                case "+":
                println(funcN(10,5))
                default:
                println(funcN(10,5))
}
}
        caculate("+"){(a:Int,b:Int)->Int in return a + b}
         caculate("-"){(a:Int,b:Int)->Int in return a - b}



四、捕获上下文中的常量和变量


        嵌套函数或闭包可以访问它所在上下文的变量和常量,这个过程称之为捕获值,即便是定义这些变量和常量的原始域已经不存在,嵌套函数或闭包仍然可以在函数体内或闭包体内引用和修改这些值。


        示例:

        funMakeArray()->String-[String]{
                var ary:[String] = [String]()
            funcAddElement(element:String)->[String]{
                ary.append(element)
                return ary
}
            return addElement
}
    let f1 = funMakeArray()
    println(f1("张三"))
    println(f1(”李四“)))


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI