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. HTTP 和FTP 状态信息总结(留着自己用)

    HTTP 状态信息 HTTP 400 – 请求无效HTTP 401.1 – 未授权:登录失败HTTP 401.2 – 未授权:服务器配置问题导致登录失败HTTP 401.3 – ACL 禁止访问资源H ...

  2. [转]Part2: Understanding !PTE, Part2: Flags and Large Pages

    http://blogs.msdn.com/b/ntdebugging/archive/2010/04/14/understanding-pte-part2-flags-and-large-pages ...

  3. Git使用指南(3)—— 使用Git命令

    暂存区替换掉工作区 git init git init newrepo 克隆仓库 git clone git clone <repo> git clone <repo> < ...

  4. webDriver 执行杀死浏览器进程方法

    /**     * 执行dos命令     * @param command     */    public static void command(String command) {       ...

  5. iOS解决NSData转NSString后字符为空

    iOS中,将NSData转NSString的一般方法为[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];但是当dat ...

  6. Mifare系列5-存储结构(转)

    文/闫鑫原创转载请注明出处http://blog.csdn.net/yxstars/article/details/38081521 Mifare S50把1K字节的容量分为16个扇区(Sector0 ...

  7. gradle相关配置内容解析

    gradle 项目的构建工具,基于groovy语言.主要用于管理依赖包. as中一般将gradle下载在C:\Documents and Settings<用户名>.gradle\wrap ...

  8. 如何监控checkbox改变

    现在想实现一个效果,即使弹幕开关,弹幕开关实际是checkbox $(document).on('change',"#barrage",function(){ if (!$(thi ...

  9. About LIS(Longest Increasing Subsequence)

    今天528给讲了基础的DP,其中第一道例题就是最长不下降子序列——LIS. 题目简述:给出N个数,求最长不下降子序列的长度. 数据范围:30% N<=1000 ; 100% N<=1000 ...

  10. C语言习题(结构)

    实际应用中经常会用到二维平面上的点,点的操作包括设置点的位置( pointT setPoint(double x , double y ) ),显示第n个点的位置( void showPoint(po ...