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

执行测试码:

  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. bk.blockProperty = {
  9. (a :Int,b:Int) -> String in
  10. let c = a*100+b
  11. return "\(a)*100+\(b) = \(c)"
  12. }
  13. bk.testProperty(0)
  14. bk.blockPropertyNoReturn = {
  15. (param:String) -> () in
  16. println("input param value is : \(param)")
  17. }
  18. bk.testProperty(1)
  19. bk.blockPropertyA = {
  20. (a:Int,b:Int) -> String in
  21. let c = a*100+b*200
  22. return "\(a)*100+\(b)*200 = \(c)"
  23. }
  24. bk.testProperty(2)
  25. bk.blockPropertyB = {
  26. (a:Int,b:Int) -> (String)->() in
  27. func sumprint(result:String)
  28. {
  29. let c = a + b;
  30. println("sumprint func print:parame :\(result) \(a) + \(b) = \(c)")
  31. }
  32. return sumprint
  33. }
  34. bk.testProperty(3)
  35. println("==============属性block完成================")
  36. println("==============函数block为nil时无输出================")
  37. bk.testBlock(nil)
  38. bk.testBlockA(nil)
  39. bk.testBlockB(nil)
  40. bk.testBlockC(nil)
  41. println("==============函数block操作================")
  42. bk.testBlock({
  43. //do something
  44. println("无参无返回值block 执行")
  45. })
  46. bk.testBlockA({
  47. (a:Int,b:Int) -> String in
  48. let c = a*400+b*1000
  49. return "\(a)*400 + \(b)*1000 is \(c)"
  50. })
  51. bk.testBlockB({
  52. (a:Int,b:Int) -> (String)->() in
  53. func sumprint(result:String)
  54. {
  55. let c = a / b;
  56. println("sumprint func print:parame :\(result) \(a) / \(b) = \(c)")
  57. }
  58. return sumprint
  59. })
  60. bk.testBlockC({
  61. (a:Int,b:Int) -> (String)->String in
  62. func sumrsult(res:String) -> String
  63. {
  64. let c = a*a+b*a
  65. return "\(res) \(a)*\(a)+\(b)*\(a) = \(c)"
  66. }
  67. return sumrsult
  68. })

以上包括了block声明和使用
下面是输出结果

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

最新文章

  1. 分析-eclipse已经导入jar包了,但还是出现classNotFound异常
  2. Navigator对象、Screen对象
  3. JQuery隐藏显示详情功能
  4. 【uoj128】 NOI2015—软件包管理器
  5. pandas 时间序列resample
  6. RobotFramework 安装配置(二)
  7. 在centos6.3用yum安装redis
  8. 【BZOJ】【3280】小R的烦恼
  9. Swift2.0 中的String(一):常用属性
  10. [BZOJ 1068] [SCOI2007] 压缩 【记忆化搜索】
  11. [置顶] 【玩转cocos2d-x之三十】点九图和输入框的使用
  12. (知识点)JS获取网页高度
  13. 分布式数据库HBase表设计
  14. Python使用Plotly绘图工具,绘制气泡图
  15. Asp.net Webform 使用Repository模式实现CRUD操作代码生成工具
  16. 洛谷P1247 取火柴游戏
  17. RPC之Jersey服务调用处理(一)
  18. 三、java面向对象编程_1
  19. 用gogs搭建git服务器
  20. VS2015 opencv 无法打开文件“opencv_calib3d330d.lib”

热门文章

  1. Mysql 解决left join 数据重复的问题
  2. JAVA发送邮件工具类
  3. 按月将Windows日志导出至CSV文件
  4. 如何用JavaScript在页面上显示一个时间钟表
  5. PHP抓取采集类snoopy介绍
  6. QQ群笔记
  7. sentinel
  8. 关于jQuery学习
  9. SQL优化(zhuan)
  10. centos6.5 扩容