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

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

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

[cpp] view plaincopy
  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. }

执行测试码:

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

[cpp] view plaincopy
  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

初探swift语言的学习笔记十(block)相关推荐

  1. 初探swift语言的学习笔记九(OC与Swift混编)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...

  2. 初探swift语言的学习笔记(闭包 - 匿名函数或block块代码)

    很多高级语言都支持匿名函数操作,在OC中的block也为大家所熟悉,然面在swift里好像是被重新作了一个定义,不叫匿名函数,或 block了,而叫闭包(closure).下面配合代码来理解一下swi ...

  3. 初探swift语言的学习笔记一(基本数据类型)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/28258805 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...

  4. 初探swift语言的学习笔记四(类对象,函数)

    2019独角兽企业重金招聘Python工程师标准>>> swift扩展了很多功能和属性,有些也比较奇P.只有慢慢学习,通过经验慢慢总结了. 下面将初步学习一下类的写法. 码工,最大爱 ...

  5. 初探swift语言的学习笔记八(保留了许多OC的实现)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/32715833 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...

  6. 初探swift语言的学习笔记七(swift 的关健词)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/32133809 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...

  7. 初探swift语言的学习笔记三(闭包-匿名函数)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29353019 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...

  8. 初探swift语言的学习笔记五(线程)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/30354127 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...

  9. 初探swift语言的学习笔记十一(performSelector)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/35842441 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...

最新文章

  1. 删除目录下的特定命名的图片,获取特定名称图片的路径
  2. sqlserver、oracle数据库排序空值null问题解决办法
  3. rsa 加密 js php,security.js+RSA做出加密功能
  4. alxc tool 报错数组超出了界限_代码审计之报错信息泄露与字符串截断
  5. 前端学习(2735):重读vue电商网站45之项目优化上线
  6. cmdline常用参数
  7. python花萼长度表_python描述性统计实践
  8. UVA763 LA5339 Fibinary Numbers【大数】
  9. 学习日记day 10 : JavaScript秋风扫落叶第一期
  10. 20170826滴滴算法工程师笔试
  11. java 拟合曲线_关于java实现自定义曲线拟合的研究
  12. 大话数据结构学习笔记(8)二叉树
  13. 解决Microsoft.NET Framework 3.5Service Pack1失败问题
  14. 月份查询(指针数组)
  15. python筛选时间范围_使用日期范围筛选模型
  16. android 刻度,Android 绘制刻度表盘
  17. 2021年不可错过的40篇AI论文,你都读过吗?
  18. element-ui之el-image-viewer(图片查看器)
  19. ubuntu16.04+caffe+GTX1060+DIGITS安装方法
  20. 基于JIRA的产品需求全生命周期管理实践

热门文章

  1. 服务器运行jupyter notebook,解决办法
  2. 自监督学习的发展趋势:事半功倍的模型训练和数据效能
  3. 岗位内推 | 阿里巴巴高德动态信息部招聘算法工程师(可实习)
  4. 论文落地 101:算法工程化的那些坑
  5. 活动推荐 | 于斯为盛,论道长沙!CCL 2018等你来!
  6. 线下报名 | YOCSEF TDS:深度强化学习的理论、算法与应用
  7. Java中Map集合类的用法(HashMap)
  8. spring-基于注解的aop开发(快速入门)
  9. mongodb导出查询结果
  10. Windows 10——安装Snort_2_9_16