• Swift闭包


    把Swift中的 block 常见的声明和写法作一个总结。以免后续忘了,好查阅。

    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. }  


    执行测试码:

    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声明和使用
    下面是输出结果

      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  
  • 相关阅读:
    oracle学习13
    oracle学习12
    oracle学习11
    oracle学习10
    CodeForces
    CodeForces
    UVA
    poj3320 Jessica's Reading Problem
    poj2456 Aggressive cows
    jQuery 鼠标滚轮插件 mousewheel
  • 原文地址:https://www.cnblogs.com/weiboyuan/p/4583750.html
Copyright © 2020-2023  润新知