把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. CSS对浏览器的兼容性(IE和Firefox)技巧整理

    CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理技巧并整理了一下.对于web2.0的过度,请尽量用xhtml格 ...

  2. c++ <string.h>中包括哪些常用函数

    常用函数如下:strlen  求字符串长度strcmp  比较2个字符串是否一样strcat           字符串连接操作strcpy            字符串拷贝操作strncat     ...

  3. html5文章 -- 使用 jQuery Mobile 与 HTML5 开发 Web App ——开发原则 | Kayo's Melody

    最近专注研究 jQuery Mobile —— 一款很方便就可以把 Web App 包装成适合 Android 与 iPhone 等触屏移动设备的 Javascript 库,结合 jQuery Mob ...

  4. sql中写标量函数生成大写拼音首字母

    USE [StockManageSystemV2] GO /****** Object: UserDefinedFunction [dbo].[PinYin] Script Date: 2016-08 ...

  5. [转]禁用和启用链接(a元素|LinkButton)的js方法

    本文转自:http://www.cnblogs.com/beiguren/archive/2010/05/24/1742926.html 在Asp.net中,有时候需要禁用掉一个a链接元素. 在服务器 ...

  6. 【iHMI43 4.3寸液晶模块】demo例程(版本1.03)发布

    ============================== 技术论坛:http://www.eeschool.org 博客地址:http://xiaomagee.cnblogs.com 官方网店:h ...

  7. html5shiv.js-让IE浏览器支持HTML5标准

    兼容性IE8及以下IE版本 浏览器IE8及以下IE版本对HTML5标签的支持是有限的,我们可以通过在网页中添加脚本的方式来解决目前IE浏览器对HTML5支持的问题. <!–[if IE]> ...

  8. Magento架构分析,Magento MVC 设计分析

    Magento架构分析,Magento MVC 设计分析 分类:Magento 标签:Magento MVC.Magento架构 669人浏览 Magento 采用类似 JAVA的架构,其扩展与稳定性 ...

  9. 【Xamarin笔记】Events, Protocols and Delegates

    Events, Protocols and Delegates   事件.协议和委托 This article presents the key iOS technologies used to re ...

  10. LR调用动态链接库DLL

    什么是动态库? 动态库一般又叫动态链接库(DLL),是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库. 动态链接提供了一种方法 ,使进程可以 ...