初探swift语言的学习笔记十(block)

作者:fengsh998
原文地址:http://blog.csdn.net/fengsh998/article/details/35783341
转载请注明出处
如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢!


在前面一些学习中,原本把闭包给理解成了block尽管有很多相似之处,但block还是有他自己的独特之外。近日,在写oc/swift混合编码时,有时候需要swift回调oc,oc回调swift 。

因此我把swift中的 block 常见的声明和写法作一个总结。以免后续忘了,好查阅。废话不说多,上例子:

[cpp]  view plain copy
  1. //  
  2. //  blockDemo.swift  
  3. //  swiftDemo  
  4. //  
  5. //  Created by apple on 14-6-29.  
  6. //  Copyright (c) 2014年 fengsh. All rights reserved.  
  7. //  
  8.   
  9. import Foundation  
  10.   
  11. //无参无返回值  
  12. typealias funcBlock = () -> () //或者 () -> Void  
  13. //返回值是String  
  14. typealias funcBlockA = (Int,Int) -> String  
  15. //返回值是一个函数指针,入参为String  
  16. typealias funcBlockB = (Int,Int) -> (String)->()  
  17. //返回值是一个函数指针,入参为String 返回值也是String  
  18. typealias funcBlockC = (Int,Int) -> (String)->String  
  19.   
  20. class blockDemo  
  21. {  
  22.     //block作为属性变量  
  23.     var blockProperty : (Int,Int) -> String = {a,b in return ""/**/// 带初始化方式  
  24.     var blockPropertyNoReturn : (String) -> () = {param in }  
  25.       
  26.     var blockPropertyA : funcBlockA?  //这写法就可以初始时为nil了,因为生命周其中,(理想状态)可能为nil所以用?  
  27.     var blockPropertyB : funcBlockB!  //这写法也可以初始时为nil了,因为生命周其中,(理想状态)认为不可能为nil,所以用!  
  28.       
  29.     init()  
  30.     {  
  31.         println("blockPropertyA = \(blockPropertyA) , blockPropertyB = \(blockPropertyB)")  
  32.         println("blockProperty = \(blockProperty) , blockPropertyNoReturn = \(blockPropertyNoReturn)")  
  33.     }  
  34.       
  35.     func testProperty(tag:Int)  
  36.     {  
  37.         switch (tag)  
  38.         {  
  39.         case 1:  
  40.                 self.blockPropertyNoReturn("OK GOOD")  
  41.         case 2:  
  42.                 if let exsistBlock = self.blockPropertyA  
  43.                 {  
  44.                     let result = self.blockPropertyA!(7,8)  
  45.                     println("result = \(result)")  
  46.                 }  
  47.         case 3:  
  48.                 if let exsistBlock = self.blockPropertyB  
  49.                 {  
  50.                     let fc = self.blockPropertyB(1,2)  
  51.                     fc("输出")  
  52.                 }  
  53.         default:  
  54.                 let ret = self.blockProperty(3,4)  
  55.                 println(ret)  
  56.         }  
  57.     }  
  58.       
  59.     //block作为函数参数  
  60.     func testBlock(blockfunc:funcBlock!)//使用!号不需要再解包  
  61.     {  
  62.         if let exsistblock = blockfunc  
  63.         {  
  64.             blockfunc() //无参无返回  
  65.         }  
  66.     }  
  67.       
  68.     func testBlockA(blockfunc:funcBlockA!)  
  69.     {  
  70.         if let exsistblock = blockfunc  
  71.         {  
  72.             let retstr = blockfunc(5,6)  
  73.             println(retstr)  
  74.         }  
  75.     }  
  76.       
  77.     func testBlockB(blockfunc:funcBlockB!)  
  78.     {  
  79.         if let exsistblock = blockfunc  
  80.         {  
  81.            let retfunc = blockfunc(5,6)  
  82.             retfunc("结果是")  
  83.         }  
  84.     }  
  85.       
  86.     func testBlockC(blockfunc:funcBlockC!)  
  87.     {  
  88.         if let exsistblock = blockfunc  
  89.         {  
  90.             let retfunc = blockfunc(5,6)  
  91.             let str = retfunc("最终果结是")  
  92.             println(str)  
  93.         }  
  94.     }  
  95. }  

执行测试码:

[cpp]  view plain copy
  1. var bk = blockDemo()  
  2. //block设置前,啥也没有输出  
  3. bk.testProperty(0)  
  4. bk.testProperty(1)  
  5. bk.testProperty(2)  
  6. bk.testProperty(3)  
  7. println("==============设置block属性================")  
  8.   
  9. bk.blockProperty = {  
  10.     (a :Int,b:Int) -> String in  
  11.     let c = a*100+b  
  12.     return "\(a)*100+\(b) = \(c)"  
  13. }  
  14. bk.testProperty(0)  
  15.   
  16. bk.blockPropertyNoReturn = {  
  17.     (param:String) -> () in  
  18.     println("input param value is : \(param)")  
  19. }  
  20. bk.testProperty(1)  
  21.   
  22. bk.blockPropertyA = {  
  23.     (a:Int,b:Int) -> String in  
  24.     let c = a*100+b*200  
  25.     return "\(a)*100+\(b)*200 = \(c)"  
  26. }  
  27. bk.testProperty(2)  
  28.   
  29. bk.blockPropertyB = {  
  30.     (a:Int,b:Int) -> (String)->() in  
  31.     func sumprint(result:String)  
  32.     {  
  33.         let c = a + b;  
  34.         println("sumprint func print:parame :\(result) \(a) + \(b) = \(c)")  
  35.     }  
  36.       
  37.     return sumprint  
  38. }  
  39. bk.testProperty(3)  
  40. println("==============属性block完成================")  
  41.   
  42. println("==============函数block为nil时无输出================")  
  43. bk.testBlock(nil)  
  44. bk.testBlockA(nil)  
  45. bk.testBlockB(nil)  
  46. bk.testBlockC(nil)  
  47. println("==============函数block操作================")  
  48. bk.testBlock({  
  49.         //do something  
  50.         println("无参无返回值block 执行")  
  51.     })  
  52.   
  53. bk.testBlockA({  
  54.         (a:Int,b:Int) -> String in  
  55.         let c = a*400+b*1000  
  56.         return "\(a)*400 + \(b)*1000 is \(c)"  
  57.     })  
  58.   
  59. bk.testBlockB({  
  60.     (a:Int,b:Int) -> (String)->() in  
  61.     func sumprint(result:String)  
  62.     {  
  63.         let c = a / b;  
  64.         println("sumprint func print:parame :\(result) \(a) / \(b) = \(c)")  
  65.     }  
  66.       
  67.     return sumprint  
  68.     })  
  69.   
  70. bk.testBlockC({  
  71.     (a:Int,b:Int) -> (String)->String in  
  72.         func sumrsult(res:String) -> String  
  73.         {  
  74.             let c = a*a+b*a  
  75.             return "\(res) \(a)*\(a)+\(b)*\(a) = \(c)"  
  76.         }  
  77.         return sumrsult  
  78.     })  
以上包括了block声明和使用
下面是输出结果

[cpp]  view plain copy
  1. blockPropertyA = nil , blockPropertyB = nil  
  2. blockProperty = (Function) , blockPropertyNoReturn = (Function)  
  3.   
  4. ==============设置block属性================  
  5. 3*100+4 = 304  
  6. input param value is : OK GOOD  
  7. result = 7*100+8*200 = 2300  
  8. sumprint func print:parame :输出 1 + 2 = 3  
  9. ==============属性block完成================  
  10. ==============函数block为nil时无输出================  
  11. ==============函数block操作================  
  12. 无参无返回值block 执行  
  13. 5*400 + 6*1000 is 8000  
  14. sumprint func print:parame :结果是 5 / 6 = 0  
  15. 最终果结是 5*5+6*5 = 55  

好了,我想这个比文字语方描述的更为清楚吧。如有不明白或其它奇怪写法,欢迎踢馆。。。。。

你可能感兴趣的:(IOS,开发学习笔记,IOS8)