Swift 05.Block
Swift的函数用法还真是灵活.但是个人感觉更灵活的还是闭包.
swift闭包的概念大抵相当于OC的block的概念.如果对于block的理解很透彻的话,闭包的原理性的东西还是很好理解的.
剩下的就是灵活多变的用法了.在学习闭包之前,我还是想从新再总结一下block的原理和用法.毕竟闭包用好了真是简化了好多东西.
block
block的基本概念与定义
block的基本定义: 返回值 (^block名字)(形参类型) = ^(形参类型 形参名){ 执行代码块 }
int (^myblock)(int) = ^(int num){
NSLog(@"block");
return num*;
};
//调用 myblock(实参)
int i = myblock();
NSLog(@"%d",i);
无返回值 无参数的block
void (^block1)() = ^(){
NSLog(@"无返回值 无参数的block");
};
//调用
block1();
有返回值 无参数
int (^block2)() = ^(){
return ;
};
block2();
无返回值 有参数
void (^block3)(int) = ^(int num){
NSLog(@"block3 = %d",num);
};
block3();
外部参数如果在block 内部使用 需要加上__block
__block int y = ;
int (^block)(int) = ^(int num){
NSLog(@"block");
return num + y;
};
int bl = block();
NSLog(@"%d",bl);
block的传值
block的传值一般用于回调.假如有A和B两个控制器.Apush到B.那么想把B控制器其中的一个值传到A控制器里面使用就可以使用block. -->从后往前传
1.定义->在B控制器中定义 block参数.将block作为参数回调给A
typedef void(^myBlock)(NSString *name);
@interface oneViewController : UIViewController @property (nonatomic,copy) myBlock myBlock;
@end
2.调用->在B控制器需要传值的地方,调用定义好的 block
if (self.myBlock) {
self.myBlock(self.textfield.text);
}
3.实现->在A控制器中 实现 block
oneViewController *one = [[oneViewController alloc]init];
one.myBlock = ^(NSString *str) {
self.textfield.text = str;
};
附上完整代码
A控制器的.m
#import "ViewController.h"
#import "oneViewController.h"
@interface ViewController () @property (nonatomic,strong) UIButton *btn;
@property (nonatomic,strong) UITextField *textfield; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. self.view.backgroundColor = [UIColor redColor]; UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(, , ,)];
btn.backgroundColor = [UIColor whiteColor];
[self.view addSubview:btn];
self.btn = btn;
[btn setTitle:@"one" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(jump:) forControlEvents:UIControlEventTouchUpInside];
self.textfield = [[UITextField alloc]initWithFrame:CGRectMake(, , , )];
self.textfield.borderStyle = UITextBorderStyleRoundedRect; [self.view addSubview:self.textfield]; }
//对应上面的 第三步 ->实现
- (void)jump:(UIButton *)btn{ oneViewController *one = [[oneViewController alloc]init]; one.myBlock = ^(NSString *str) { self.textfield.text = str;
}; [self.navigationController pushViewController:one animated:YES]; }
B控制器的.h
//对应上面的第一步 ->定义
#import <UIKit/UIKit.h> typedef void(^myBlock)(NSString *name);
@interface oneViewController : UIViewController @property (nonatomic,copy) myBlock myBlock; @end
B控制器的.m
#import "oneViewController.h" @interface oneViewController () @property (nonatomic,strong) UIButton *btn;
@property (nonatomic,strong) UITextField *textfield; @end @implementation oneViewController - (void)viewDidLoad {
[super viewDidLoad]; self.view.backgroundColor = [UIColor grayColor]; UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(, , ,)];
btn.backgroundColor = [UIColor whiteColor];
[self.view addSubview:btn];
self.btn = btn;
[btn setTitle:@"one" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(jump:) forControlEvents:UIControlEventTouchUpInside];
self.textfield = [[UITextField alloc]initWithFrame:CGRectMake(, , , )];
self.textfield.borderStyle = UITextBorderStyleRoundedRect;
[self.view addSubview:self.textfield];
}
//对应上面的第二步 ->调用
-(void)jump:(UIButton *)btn {
if (self.myBlock) {
self.myBlock(self.textfield.text);
}
[self.navigationController popToRootViewControllerAnimated:YES];
}
@end
Swift 05.Block的更多相关文章
- swift中block的使用
在OC中习惯用block来传值,而swift中,block被重新定义了一下,叫闭包: 使用的技巧:谁定义谁传值: 案例使用A.B控制器: 1~4步在B中执行,最后在A中执行: - B控制器: 1- ...
- Swift - 05 - 数值型字面量
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
- JSPatch 遇上swift
swift使用JSPatch要点: 继承自NSObject的Swift类,其继承自父类的方法具有动态性,其他自定义方法.属性需要加dynamic修饰才可以获得动态性(public属性除外) 例子可参看 ...
- Swift与JS的交互
Swift与JS的交互 原理 同Object-C与JS交互的大同小异,只是方法形式改变了. 首先我们需要引入iOS7.0出来的JavaScriptCore.framework JavaScriptCo ...
- NSObject+YYModel.h
01 - nil Nil NULL NSNull kCFNull 的区别 参考:http://www.jianshu.com/p/3aaefb3bcf73 02 - __bridge,__bridg ...
- openstack是什么
下面图片多来自互联网. 云计算: 云计算层次机构模型: IaaS 基础设施服务 PaaS 平台级服务 SaaS 软件级服务 官网:http://www.openstack.org/ openstack ...
- 红帽 Enterprise Linux OpenStack Platform 4.0全面上市
十一月,红帽公司推出Red Hat Enterprise Linux OpenStack Platform 4.0测试版,这款企业级解决方案集Red Hat Enterprise Linux的稳定性与 ...
- OpenStack项目列表
这个也是必须要熟悉的哟. ~~~~~~~~~~ OpenStack是一个美国国家航空航天局和Rackspace合作研发的,以Apache许可证授权,并且是一个自由软件和开放源代码项目.OpenStac ...
- OC加强-day03
#program mark - 0_18 分类的使用注意 [掌握] 1.分类的作用 作用:讲一个类分为多个模块,将相似功能的方法写在同一个模块中,方便我们后面代码的维护 "强调 1.分类中只 ...
随机推荐
- 《在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波》 --Gabor增强的具体实践
<在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波> --Gabor增强的具体实践 一.问 ...
- command 'x86_64-linux-gnu-gcc' failed with exit status 1错误及解决方案
Ubuntu16.04安装Scrapy(pip install Scrapy)时提示错误如下: Failed building wheel for cryptography Running setup ...
- 新项目CRM(1)
<title>CRM登陆</title> <script type="text/javascript"> if (window.parent.w ...
- iOS 使用Block进行逆传值
跟通知一样也是两个控制器,然后代码创建控件直接上代码 #import "ViewController.h" #import "TwoViewController.h&qu ...
- javax.crypto.BadPaddingException: Given final block not properly padded
一.报错 写了一个加密方法,在Windows上运行没有问题,在Linux上运行时提示如下错误: javax.crypto.BadPaddingException: Given final block ...
- HDU 5938 Four Operations(四则运算)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- python成长之路【第十篇】:浅析python select模块
一.select介绍 select()的机制中提供一fd_set的数据结构,实际上是一long类型的数组, 每一个数组元素都能与一打开的文件句柄(不管是Socket句柄,还是其他文件或命名管道或设备句 ...
- ajax post 请求415\ 400 错误
今天用ajax 向后台发送 post请求时,出现了两个问题: 1, 发送请求后,控制台 返回 Unsupported media type-415(不支持的媒体类型),这时突然想起来,post 请求 ...
- asp.net 获取汉字字符串的拼音首字母,含多音字
需求:在很多时候数据查询的时候,我们希望输入某个人姓名的拼音首字母进行查询,例如“潘长江”,输入“pcj”,就能搜索潘长江相关信息. 实现: #region 获取汉字转换拼音 首字母 public s ...
- angular中ng-repeat ng-if 中的变量的值控制器中为什么取不到
这个问题的本质是:v-repeat会产生子scope,这时你在控制器里拿值,相当于父scope里面取子scope的值,因为Angular.js中作用域是向上查找的,所以取不到. 操作过程如下: 相关代 ...