Swift闭包
把Swift中的 block 常见的声明和写法作一个总结。以免后续忘了,好查阅。
- //
- // blockDemo.swift
- // swiftDemo
- //
- // Created by apple on 14-6-29.
- // Copyright (c) 2014年 fengsh. All rights reserved.
- //
- import Foundation
- //无参无返回值
- typealias funcBlock = () -> () //或者 () -> Void
- //返回值是String
- typealias funcBlockA = (Int,Int) -> String
- //返回值是一个函数指针,入参为String
- typealias funcBlockB = (Int,Int) -> (String)->()
- //返回值是一个函数指针,入参为String 返回值也是String
- typealias funcBlockC = (Int,Int) -> (String)->String
- class blockDemo
- {
- //block作为属性变量
- var blockProperty : (Int,Int) -> String = {a,b in return ""/**/} // 带初始化方式
- var blockPropertyNoReturn : (String) -> () = {param in }
- var blockPropertyA : funcBlockA? //这写法就可以初始时为nil了,因为生命周其中,(理想状态)可能为nil所以用?
- var blockPropertyB : funcBlockB! //这写法也可以初始时为nil了,因为生命周其中,(理想状态)认为不可能为nil,所以用!
- init()
- {
- println("blockPropertyA = \(blockPropertyA) , blockPropertyB = \(blockPropertyB)")
- println("blockProperty = \(blockProperty) , blockPropertyNoReturn = \(blockPropertyNoReturn)")
- }
- func testProperty(tag:Int)
- {
- switch (tag)
- {
- case 1:
- self.blockPropertyNoReturn("OK GOOD")
- case 2:
- if let exsistBlock = self.blockPropertyA
- {
- let result = self.blockPropertyA!(7,8)
- println("result = \(result)")
- }
- case 3:
- if let exsistBlock = self.blockPropertyB
- {
- let fc = self.blockPropertyB(1,2)
- fc("输出")
- }
- default:
- let ret = self.blockProperty(3,4)
- println(ret)
- }
- }
- //block作为函数参数
- func testBlock(blockfunc:funcBlock!)//使用!号不需要再解包
- {
- if let exsistblock = blockfunc
- {
- blockfunc() //无参无返回
- }
- }
- func testBlockA(blockfunc:funcBlockA!)
- {
- if let exsistblock = blockfunc
- {
- let retstr = blockfunc(5,6)
- println(retstr)
- }
- }
- func testBlockB(blockfunc:funcBlockB!)
- {
- if let exsistblock = blockfunc
- {
- let retfunc = blockfunc(5,6)
- retfunc("结果是")
- }
- }
- func testBlockC(blockfunc:funcBlockC!)
- {
- if let exsistblock = blockfunc
- {
- let retfunc = blockfunc(5,6)
- let str = retfunc("最终果结是")
- println(str)
- }
- }
- }
执行测试码:
- var bk = blockDemo()
- //block设置前,啥也没有输出
- bk.testProperty(0)
- bk.testProperty(1)
- bk.testProperty(2)
- bk.testProperty(3)
- println("==============设置block属性================")
- bk.blockProperty = {
- (a :Int,b:Int) -> String in
- let c = a*100+b
- return "\(a)*100+\(b) = \(c)"
- }
- bk.testProperty(0)
- bk.blockPropertyNoReturn = {
- (param:String) -> () in
- println("input param value is : \(param)")
- }
- bk.testProperty(1)
- bk.blockPropertyA = {
- (a:Int,b:Int) -> String in
- let c = a*100+b*200
- return "\(a)*100+\(b)*200 = \(c)"
- }
- bk.testProperty(2)
- bk.blockPropertyB = {
- (a:Int,b:Int) -> (String)->() in
- func sumprint(result:String)
- {
- let c = a + b;
- println("sumprint func print:parame :\(result) \(a) + \(b) = \(c)")
- }
- return sumprint
- }
- bk.testProperty(3)
- println("==============属性block完成================")
- println("==============函数block为nil时无输出================")
- bk.testBlock(nil)
- bk.testBlockA(nil)
- bk.testBlockB(nil)
- bk.testBlockC(nil)
- println("==============函数block操作================")
- bk.testBlock({
- //do something
- println("无参无返回值block 执行")
- })
- bk.testBlockA({
- (a:Int,b:Int) -> String in
- let c = a*400+b*1000
- return "\(a)*400 + \(b)*1000 is \(c)"
- })
- bk.testBlockB({
- (a:Int,b:Int) -> (String)->() in
- func sumprint(result:String)
- {
- let c = a / b;
- println("sumprint func print:parame :\(result) \(a) / \(b) = \(c)")
- }
- return sumprint
- })
- bk.testBlockC({
- (a:Int,b:Int) -> (String)->String in
- func sumrsult(res:String) -> String
- {
- let c = a*a+b*a
- return "\(res) \(a)*\(a)+\(b)*\(a) = \(c)"
- }
- return sumrsult
- })
以上包括了block声明和使用
下面是输出结果
- blockPropertyA = nil , blockPropertyB = nil
- blockProperty = (Function) , blockPropertyNoReturn = (Function)
- ==============设置block属性================
- 3*100+4 = 304
- input param value is : OK GOOD
- result = 7*100+8*200 = 2300
- sumprint func print:parame :输出 1 + 2 = 3
- ==============属性block完成================
- ==============函数block为nil时无输出================
- ==============函数block操作================
- 无参无返回值block 执行
- 5*400 + 6*1000 is 8000
- sumprint func print:parame :结果是 5 / 6 = 0
- 最终果结是 5*5+6*5 = 55
Swift闭包的更多相关文章
- Swift闭包概念与常见使用场景总结
·Swift 闭包 闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些 ...
- Swift --闭包表达式与闭包(汇编分析)
在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数! 一.闭包表达式 概念 闭包表达式与定义函数的语法相对比,有区别如下: 去除了func 去除函数名 返回值类型添加了关键 ...
- swift 闭包循环引用
当使用闭包时,类本身持有self,然后又在闭包中访问了self或者self的属性,就会导致恶心额循环引用.swift提供的解决方法是在闭包中定义捕获列表,捕获列表是闭包想怎么引用捕获来的变量.例如下面 ...
- swift 闭包
闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着 这些常量和变量,俗称闭包. Swift标准库中提供了sort排序函数,sort函数的第二个参数是个闭包.和OC中的bl ...
- [ios][swift]使用swift闭包进行viewcontroller反向传值
闭包参考:http://c.biancheng.net/cpp/html/2285.html 闭包详解 传值参考:http://www.tuicool.com/articles/vy2uUz Sw ...
- swift 闭包简写实际参数名$0、$1等理解
Swift 自动对行内闭包提供简写实际参数名,你也可以通过 $0 , $1 , $2 等名字来引用闭包的实际参数值. 如果你在闭包表达式中使用这些简写实际参数名,那么你可以在闭包的实际参数列表中忽略对 ...
- Swift闭包(Closure)
语法: { (parameters) ->return type in statements} 实例:采用函数实现: let names =["Chris", "A ...
- swift闭包传值
不知道原理,就知道这么用的,皮毛上的那一点. 寻思着把以前的项目改成swift的,结果了,,, 反向传值 一. //类似于OC中的typedef typealias sendValueClosure= ...
- swift闭包-备
我给Swift 中的闭包一个定义:闭包是自包含的匿名函数代码块,可以作为表达式.函数参数和函数返回值,闭包表达式的运算结果是一种函数类型. Swift中的闭包类似于Objective-C中的代码块.J ...
- Swift 闭包表达式
闭包是功能性自包含模块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的 blocks 以及其他一些编程语言中的 lambdas 比较相似. 闭包的形式主要有三 ...
随机推荐
- c语言字符串操作,及常用函数
一,字符串操作 1 . strcpy : 拷贝 char *stpcpy(char *destin, char *source); 2 . strcat : 拼接 char *strcat(char ...
- Ubuntu SSH root user cannot login
Open /etc/ssh/sshd_config and check if PermitRootLogin is set to yes. If not, then set it to yes and ...
- OC中的属性、方法及内存管理
普通方法:关注(代表)对象可以”干什么”,过程中需要实例变量.-(void)show;输出 … 访问属性 属性:属性专门处理实例变量.(程序执行过程当中) 初始化方法:一创建对象(第一时间 ...
- 交叉报表列头排序时遇到的oracle问题—oracle ORA-12704:字符集不匹配、varchar2转化为nvarchar2字符缺失、case when else后的字符类型要一致
在做交叉报表列头的排序时,遇到这三个问题,下面具体来说一下. 设计的数据库的表结构如图1所示: 图1 要处出来student_name_,s.grade_,s.subject_name_,这三个属性, ...
- 拦截webview调用系统浏览器打开链接
给WebView设置自定义的WebViewClient即可 webview.setWebViewClient(new WebViewClient(){ @Override public boolean ...
- 翻译 Tri-Ace:在Shader里近似渲染公式
继上一篇:次世代基于物理渲染的反射模型,本篇是Tri-Ace 在cedec2014上最近发布的, 主要内容如名称所示,解释了他们在实现基于物理渲染时,对shader的渲染公式所做的近似工作. ...
- 关于DWZ模板中全选的使用
只在使用DWZ框架时有用 模板中 <input type="checkbox" name="rule_id[]" />选项1 <input t ...
- 使用无限生命期Session的方法
使用无限生命期Session的方法 [来源] 达内 [编辑] 达内 [时间]2013-03-28 Session储存在服务器端,根据客户端提供的SessionID来得到这个用户的文件,然后读 ...
- Bootstrap页面布局22 - BS工具提示
当鼠标点击在一个a连接上时,显示提示文字的效果 ---------------- tooltip <div class='container-fluid'> <h3 class=' ...
- 不遗留问题-menu数据拼装
DROP TABLE IF EXISTS `menu0910`; CREATE TABLE `menu0910` ( `id` ) NOT NULL AUTO_INCREMENT, `menu` ) ...