在前面一些学习中,原本把闭包给理解成了block尽管有很多相似之处,但block还是有他自己的独特之外。近日,在写oc/swift混合编码时,有时候需要swift回调oc,oc回调swift 。
因此我把swift中的 block 常见的声明和写法作一个总结。以免后续忘了,好查阅。废话不说多,上例子:
[cpp] view plain copy // //blockDemo.swift //swiftDemo // //Createdbyappleon14-6-29. //copyright(c)2014年fengsh.Allrightsreserved. importFoundation //无参无返回值 typealiasfuncBlock=()->()//或者()->VoID //返回值是String typealiasfuncBlockA=(Int,Int)->String //返回值是一个函数指针,入参为String typealiasfuncBlockB=(Int,Int)->(String)->() //返回值是一个函数指针,入参为String返回值也是String typealiasfuncBlockC=(Int,Int)->(String)->String classblockDemo { //block作为属性变量 varblockProperty:(Int,Int)->String={a,binreturn""/**/}//带初始化方式 varblockPropertynoreturn:(String)->()={paramin} varblockPropertyA:funcBlockA?//这写法就可以初始时为nil了,因为生命周其中,(理想状态)可能为nil所以用? varblockPropertyB:funcBlockB!//这写法也可以初始时为nil了,因为生命周其中,(理想状态)认为不可能为nil,所以用! init() { println("blockPropertyA=\(blockPropertyA),blockPropertyB=\(blockPropertyB)") println("blockProperty=\(blockProperty),blockPropertynoreturn=\(blockPropertynoreturn)") } functestProperty(tag:Int) switch(tag) case1: self.blockPropertynoreturn("OKGOOD") case2: ifletexsistBlock=self.blockPropertyA letresult=self.blockPropertyA!(7,8) println("result=\(result)") } case3: ifletexsistBlock=self.blockPropertyB letfc=self.blockPropertyB(1,2) fc("输出") default: letret=self.blockProperty(3,4) println(ret) //block作为函数参数 functestBlock(blockfunc:funcBlock!)//使用!号不需要再解包 ifletexsistblock=blockfunc blockfunc()//无参无返回 functestBlockA(blockfunc:funcBlockA!) letretstr=blockfunc(5,6) println(retstr) functestBlockB(blockfunc:funcBlockB!) ifletexsistblock=blockfunc letretfunc=blockfunc(5,6) retfunc("结果是") functestBlockC(blockfunc:funcBlockC!) letretfunc=blockfunc(5,108); List-style:decimal-leading-zero outsIDe; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> letstr=retfunc("最终果结是") println(str) } @H_336_404@
执行测试码:
@H_445_419@ varbk=blockDemo() //block设置前,啥也没有输出 bk.testProperty(0) bk.testProperty(1) bk.testProperty(2) bk.testProperty(3) println("==============设置block属性================") bk.blockProperty={ (a:Int,b:Int)->Stringin letc=a*100+b return"\(a)*100+\(b)=\(c)" bk.testProperty(0) bk.blockPropertynoreturn={ (param:String)->()in println("inputparamvalueis:\(param)") bk.blockPropertyA={ (a:Int,b:Int)->Stringin letc=a*100+b*200 return"\(a)*100+\(b)*200=\(c)" bk.blockPropertyB={ funcsumprint(result:String) letc=a+b; println("sumprintfuncprint:parame:\(result)\(a)+\(b)=\(c)") returnsumprint bk.testProperty(3) println("==============属性block完成================") println("==============函数block为nil时无输出================") bk.testBlock(nil) bk.testBlockA(nil) bk.testBlockB(nil) bk.testBlockC(nil) println("==============函数block *** 作================") bk.testBlock({ //dosomething println("无参无返回值block执行") }) bk.testBlockA({ letc=a*400+b*1000 return"\(a)*400+\(b)*1000is\(c)" bk.testBlockB({ letc=a/b; println("sumprintfuncprint:parame:\(result)\(a)/\(b)=\(c)") }) bk.testBlockC({ funcsumrsult(res:String)->String letc=a*a+b*a return"\(res)\(a)*\(a)+\(b)*\(a)=\(c)" returnsumrsult }) @H_336_404@ 以上包括了block声明和使用
下面是输出结果
@H_445_419@ blockPropertyA=nil,blockPropertyB=nil blockProperty=(Function),blockPropertynoreturn=(Function) ==============设置block属性================ 3*100+4=304 inputparamvalueis:OKGOOD result=7*100+8*200=2300 sumprintfuncprint:parame:输出1+2=3 ==============属性block完成================ ==============函数block为nil时无输出================ ==============函数block *** 作================ 无参无返回值block执行 5*400+6*1000is8000 sumprintfuncprint:parame:结果是5/6=0 最终果结是5*5+6*5=55 @H_336_404@ 总结
以上是内存溢出为你收集整理的初探swift语言的学习笔记十(block)全部内容,希望文章能够帮你解决初探swift语言的学习笔记十(block)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)