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文件atom

#import <Foundation/Foundation.h>

@interface CalculatorManager : NSObject

/** 結果值*/
@property(assign, nonatomic) int result;

-(void)add:(int)value;

@end

CalculatorManager.m文件code

#import "CalculatorManager.h"

@implementation CalculatorManager

-(void)add:(int)value
{
    _result += value;
}
@end

假設如今外部控制器調用該方法,須要計算得出從1加到4的結果值:it

-(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);
}

代碼行數這麼多,一股強烈的弱者氣息.....因而:io


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

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

這樣外界控制器調用該方法時,就變成這樣了:import

- (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這類型的用法在理解上抱有疑惑的話,但願這個小例子能幫到您:)

相關文章
相關標籤/搜索