zoukankan      html  css  js  c++  java
  • Swift 05.Block

    Swift的函数用法还真是灵活.但是个人感觉更灵活的还是闭包.

    swift闭包的概念大抵相当于OC的block的概念.如果对于block的理解很透彻的话,闭包的原理性的东西还是很好理解的.

    剩下的就是灵活多变的用法了.在学习闭包之前,我还是想从新再总结一下block的原理和用法.毕竟闭包用好了真是简化了好多东西.

    block

    block的基本概念与定义

      block的基本定义: 返回值 (^block名字)(形参类型) = ^(形参类型 形参名){ 执行代码块 }

    int (^myblock)(int) = ^(int num){
    
            NSLog(@"block");
    
            return num*2;
    
        };
    
        //调用  myblock(实参)
    
       int i =  myblock(3);
    
        NSLog(@"%d",i);

    无返回值 无参数的block

        

    void (^block1)() = ^(){
    
            NSLog(@"无返回值 无参数的block");
    
        };
    
        //调用
    
        block1();

    有返回值 无参数

        

    int (^block2)() = ^(){
          return 2;
    
        };
    
        block2();

    无返回值 有参数

       

     void (^block3)(int) = ^(int num){
    
            NSLog(@"block3 = %d",num);
        };
    
        block3(5);

    外部参数如果在block 内部使用 需要加上__block

        __block int y = 90;
    
        int (^block)(int) = ^(int num){
    
            NSLog(@"block");
    
            return num + y;
    
        };
    
       int bl =  block(10);
    
        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(150, 150, 20,30)];
        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(50, 50, 200, 30)];

         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(150, 150, 20,30)];
        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(50, 50, 200, 30)];
        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
  • 相关阅读:
    【纯水题】POJ 1852 Ants
    【树形DP】BZOJ 1131 Sta
    【不知道怎么分类】HDU
    【树形DP】CF 1293E Xenon's Attack on the Gangs
    【贪心算法】CF Emergency Evacuation
    【思维】UVA 11300 Spreading the Wealth
    【树形DP】NOI2003 逃学的小孩
    【树形DP】BZOJ 3829 Farmcraft
    【树形DP】JSOI BZOJ4472 salesman
    【迷宫问题】CodeForces 1292A A NEKO's Maze Game
  • 原文地址:https://www.cnblogs.com/Atropos/p/5088243.html
Copyright © 2011-2022 走看看