把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

Swift闭包的更多相关文章

  1. Swift闭包概念与常见使用场景总结

    ·Swift 闭包 闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些 ...

  2. Swift --闭包表达式与闭包(汇编分析)

    在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数! 一.闭包表达式 概念 闭包表达式与定义函数的语法相对比,有区别如下: 去除了func 去除函数名 返回值类型添加了关键 ...

  3. swift 闭包循环引用

    当使用闭包时,类本身持有self,然后又在闭包中访问了self或者self的属性,就会导致恶心额循环引用.swift提供的解决方法是在闭包中定义捕获列表,捕获列表是闭包想怎么引用捕获来的变量.例如下面 ...

  4. swift 闭包

    闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着 这些常量和变量,俗称闭包. Swift标准库中提供了sort排序函数,sort函数的第二个参数是个闭包.和OC中的bl ...

  5. [ios][swift]使用swift闭包进行viewcontroller反向传值

    闭包参考:http://c.biancheng.net/cpp/html/2285.html   闭包详解 传值参考:http://www.tuicool.com/articles/vy2uUz Sw ...

  6. swift 闭包简写实际参数名$0、$1等理解

    Swift 自动对行内闭包提供简写实际参数名,你也可以通过 $0 , $1 , $2 等名字来引用闭包的实际参数值. 如果你在闭包表达式中使用这些简写实际参数名,那么你可以在闭包的实际参数列表中忽略对 ...

  7. Swift闭包(Closure)

    语法: { (parameters) ->return type in statements} 实例:采用函数实现: let names =["Chris", "A ...

  8. swift闭包传值

    不知道原理,就知道这么用的,皮毛上的那一点. 寻思着把以前的项目改成swift的,结果了,,, 反向传值 一. //类似于OC中的typedef typealias sendValueClosure= ...

  9. swift闭包-备

    我给Swift 中的闭包一个定义:闭包是自包含的匿名函数代码块,可以作为表达式.函数参数和函数返回值,闭包表达式的运算结果是一种函数类型. Swift中的闭包类似于Objective-C中的代码块.J ...

  10. Swift 闭包表达式

    闭包是功能性自包含模块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的 blocks 以及其他一些编程语言中的 lambdas 比较相似. 闭包的形式主要有三 ...

随机推荐

  1. RN组件之Switch与Picker

    一.Switch选择开关控件 1.该组件为Android/IOS通用的两种状态的开关组件 2.属性方法 (1)disabled bool:如果该值为true,用户就无法点击switch开关,默认为fa ...

  2. python中的list的方法

    list1=[1,3,5,"a"]print(dir(list1)) """ ['__add__', '__class__', '__contains ...

  3. Scala中Zip相关的函数

    在Scala中存在好几个Zip相关的函数,比如zip,zipAll,zipped 以及zipWithIndex等等.我们在代码中也经常看到这样的函数,这篇文章主要介绍一下这些函数的区别以及使用. 1. ...

  4. ajax无刷新获取php后台数据

    $.ajax({ url:"result.php", //data:{"page":i}, dataType:"json", beforeS ...

  5. hdu 最大报销额

    本题也是一个背包的问题,我觉得这道题的核心就是根据精确度将浮点型转化为整型然后利用动态规划进行求解,注意对题意的理解,有3种支票是不能够报销的. 我开始照着这个思路进行思考,但是敲出来的第一个代码居然 ...

  6. Bloomberg SEP 12.x 迁移小记

        备份 个文件: D:\Program Files\Symantec\Symantec Endpoint Protection Manager\Server Private Key Backup ...

  7. 将url的查询参数解析成字典对象

    1, 这个题目不约而同的出现在了多家公司的面试题中,当然也是因为太过于典型,解决方案无非就是拆字符或者用正则匹配来解决,我个人强烈建议用正则匹配,因为url允许用户随意输入,如果用拆字符的方式,有任何 ...

  8. FZU 2028 BFS+vector

    一个普通的bfs 如果不看样例和input的解释... 四个0真是神样例 又被input误导 以为每个点都按顺序有标号 传送门的终点给的是一个点的标号 然后结果是什么呢?无尽的runtime erro ...

  9. twitter storm源码走读之7 -- trident topology可靠性分析

    欢迎转载,转载请注明出处,徽沪一郎. 本文详细分析TridentTopology的可靠性实现, TridentTopology通过transactional spout与transactional s ...

  10. 推荐的PHP编码规范

    推荐的PHP编码规范 发布时间: 2014-05-7 浏览次数:2754 分类: PHP教程 推荐的PHP编码规范 一 编辑器设置 1. 使用Tab缩进,不要使用空格 鉴于很多编辑器在保存文件时会自动 ...