zoukankan      html  css  js  c++  java
  • Block作为返回值时的使用

    昨天使用一个小例子简单说明了下Block作为参数时的使用。
    今天再来复习一下Block作为返回值使用时的情况,先贴一小段热门第三方框架Masonry的官方sample code:

    [view1 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(superview).with.insets(padding);
    }];
    

    其中关于...equalTo(superview).....insets(padding)
    之前没接触过这类用法的童鞋,可能看到这行代码就瞬间一脸懵逼了(挖槽(⊙□⊙) ,点语法接括号参数再接点语法是什么鬼,我Object-C读的少不要骗我...)。

    淡定,还记得block的基本用法吗block(参数),其实这里就是使用了Block用作了方法的返回值,同时在Block里面又返回了self自身而形成了一个链式结构。这样说有些抽象,我们还是以昨天那个CalculatorManager工具类为例。


    版本1.0
    首先,我们先在工具类中实现一个很简单的方法:外界传递一个整形参数,然后将其与原结果值相加,再保存起来作为新的结果值。
    CalculatorManager.h文件

    #import <Foundation/Foundation.h>
    
    @interface CalculatorManager : NSObject
    
    /** 结果值*/
    @property(assign, nonatomic) int result;
    
    -(void)add:(int)value;
    
    @end
    

    CalculatorManager.m文件

    #import "CalculatorManager.h"
    
    @implementation CalculatorManager
    
    -(void)add:(int)value
    {
        _result += value;
    }
    @end
    

    假设现在外部控制器调用该方法,需要计算得出从1加到4的结果值:

    -(void)viewDidLoad {
        [super viewDidLoad];
    
        CalculatorManager *manager = [[CalculatorManager alloc] init];
    
        [manager add: 1];
        [manager add: 2];
        [manager add: 3];
        [manager add: 4];
    
        NSLog(@"%d", manager.result);
    }
    

    代码行数这么多,一股强烈的弱者气息.....于是:


    版本1.1:
    修改(void)add:(int)方法,添加返回值,返回值为工具类self自身:

    -(instancetype)add:(int)value
    {
        _result += value;
        return self;
    }
    

    这样外界控制器调用该方法时,就变成这样了:

    - (void)viewDidLoad {
        [super viewDidLoad];
       
        CalculatorManager *manager = [[CalculatorManager alloc] init];
        
        [[[[manager add:1] add:2] add:3] add:4];
        
        NSLog(@"%d", manager.result);
    }
    

    代码变成了一行,比起之前清爽多了,但这长长的中括号[嵌套看起来还是弱爆了,于是:


    版本1.2
    继续修改(instancetype)add:(int)方法,将方法的返回值,替换为:一个返回值为CalculatorManager instance的Block代码块:

    -(CalculatorManager *(^)(int))add
    {
        //方法本身返回一个blockd代码块
        return ^CalculatorManager *(int value){
            _result += value;
            //block块内部再返回一个instance实例
            return self;
        };
    }
    

    这样外界就可以通过点语法这样调用:

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        CalculatorManager *manager = [[CalculatorManager alloc] init];
        
        manager.add(1).add(2).add(3).add(4);
        
        NSLog(@"%d", manager.result);
    }
    

    瞬间逼格就提高了不少有木有(=゚ω゚)ノ。言归正传,据说这个叫链式编程思想,好处在于可以将多个方法,用点语法的方式链接起来,显得简洁、可读性高。
    如果先前对Block这类型的用法在理解上抱有疑惑的话,希望这个小例子能帮到您:)

  • 相关阅读:
    vue实现语音播报功能
    vue使用vueCropper裁剪功能,代码复制直接使用
    阿里云服务器安装mongodb并且启动
    脚手架安装react
    PHP 和Apache的安装和配置
    CentOS yum 源的配置与使用
    Linux -Yum 命令详解
    (干货)Linux学习资源推荐
    linux学习书籍推荐linux学习书籍推荐
    一些C++内容的总结(2013.10.17)
  • 原文地址:https://www.cnblogs.com/ShaRuru/p/5152443.html
Copyright © 2011-2022 走看看