加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift函数闭包

发布时间:2020-12-14 02:19:12 所属栏目:百科 来源:网络整理
导读:一、闭包的概念 计算机语言要支持闭包的前提条件有2个: 1、支持函数类型,能够将函数作为参数或返回值传递; 2、支持函数嵌套 示例: func caculate(opr : String)-(Int,Int)-Int { var result:(Int,Int)-Int switch(opr){ case "+": result={(a:Int,b:Int)

一、闭包的概念


计算机语言要支持闭包的前提条件有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

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)


三、使用尾随闭包


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


示例:

funccaculate(opr:String,funcN:(Int,Int)->Int){
switchopr{
case"+":
println(funcN(10,5))
default:
println(funcN(10,5))
}
}
caculate("+"){(a:Int,b:Int)->Intinreturna+b}
caculate("-"){(a:Int,b:Int)->Intinreturna-b}



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


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


示例:

funMakeArray()->String-[String]{
varary:[String]=[String]()
funcAddElement(element:String)->[String]{
ary.append(element)
returnary
}
returnaddElement
}
letf1=funMakeArray()
println(f1("张三"))
println(f1(”李四“)))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读