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的更多相关文章

  1. swift中block的使用

    在OC中习惯用block来传值,而swift中,block被重新定义了一下,叫闭包: 使用的技巧:谁定义谁传值:   案例使用A.B控制器: 1~4步在B中执行,最后在A中执行: - B控制器: 1- ...

  2. Swift - 05 - 数值型字面量

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  3. JSPatch 遇上swift

    swift使用JSPatch要点: 继承自NSObject的Swift类,其继承自父类的方法具有动态性,其他自定义方法.属性需要加dynamic修饰才可以获得动态性(public属性除外) 例子可参看 ...

  4. Swift与JS的交互

    Swift与JS的交互 原理 同Object-C与JS交互的大同小异,只是方法形式改变了. 首先我们需要引入iOS7.0出来的JavaScriptCore.framework JavaScriptCo ...

  5. NSObject+YYModel.h

    01 - nil Nil NULL NSNull kCFNull  的区别 参考:http://www.jianshu.com/p/3aaefb3bcf73 02 - __bridge,__bridg ...

  6. openstack是什么

    下面图片多来自互联网. 云计算: 云计算层次机构模型: IaaS 基础设施服务 PaaS 平台级服务 SaaS 软件级服务 官网:http://www.openstack.org/ openstack ...

  7. 红帽 Enterprise Linux OpenStack Platform 4.0全面上市

    十一月,红帽公司推出Red Hat Enterprise Linux OpenStack Platform 4.0测试版,这款企业级解决方案集Red Hat Enterprise Linux的稳定性与 ...

  8. OpenStack项目列表

    这个也是必须要熟悉的哟. ~~~~~~~~~~ OpenStack是一个美国国家航空航天局和Rackspace合作研发的,以Apache许可证授权,并且是一个自由软件和开放源代码项目.OpenStac ...

  9. OC加强-day03

    #program mark - 0_18 分类的使用注意 [掌握] 1.分类的作用 作用:讲一个类分为多个模块,将相似功能的方法写在同一个模块中,方便我们后面代码的维护 "强调 1.分类中只 ...

随机推荐

  1. 不写完不让回家的JQuery的事件与动画

    在这看不见太阳的小黑屋里,苦逼的一天又开始了 好了闲话我也就不扯了,接下来我就来说说我对jQuery事件和动画的理解吧!!! 还是得再扯两句,我们敬爱的,Y老师讲完了,jQuery事件和动画,对着我们 ...

  2. ( [原创] 4s摄像头出现的问题及解决办法集锦。

    [原创] 4s摄像头出现的问题及解决办法集锦. [复制链接]     HPagani 34主题 126帖子 13人气 级别: 青苹果 帖子 126 经验 160 精华 人气 13 粉丝1 发消息   ...

  3. IOS的H5页面滑动不流畅的问题:

    IOS的H5页面滑动不流畅的问题: -webkit-overflow-scrolling : touch; 需要滑动的是哪块区域,就在哪里加上这段代码就OK

  4. iOS_XCode7_Launch Image 的初使用

    之前一直没有做笔记的习惯,后来发现很多知识不常用,容易忘了,再去网上找的,很浪费时间,现在尝试着自己写写博客,可以是自己笔记,方便以后查询,如果有纰漏,欢迎指正. 1.Xcode7中 ,assets. ...

  5. Hibernate映射文件创建和删除触发器,存储过程等数据库对象

    创建表,触发器,和存储过程等数据库对象,这里一定要用create 在hibernate.cfg.xml文件中

  6. 自学 web 前端人怎么找工作?

    1,你做过的项目可以体现你的价值.2,你的个人博客可以反映你的思考.3,你的GitHub页面可以展示你的项目.4,你项目中的代码可以看出你编程的风格.1,2,3,4之间有交集.当你能证明,你能创造的价 ...

  7. Cocos2d-x 核心概念 - 导演(Director)

    导演类(Director) 用于管理场景对象,采用的是单例模式(单例模式能保存一致的配置信息,方便管理场景对象) 获得导演实例的语句如下 local director = cc.Director:ge ...

  8. moq 的常用使用方法

    测试方法                             Console.WriteLine(mock.Object.GetCountThing()); 匹配参数   mock.Setup(x ...

  9. Java知识积累1-StringAlign实现文字居中左右对齐

    import java.text.*;public class StringAlign extends Format{ public static final int JUST_LEFT='l'; / ...

  10. yyyy-MM-dd与YYYY-MM-dd

    Date date=new Date(); DateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:MM:SS"); DateForm ...