昨天使用一個小例子簡單說明了下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這類型的用法在理解上抱有疑惑的話,但願這個小例子能幫到您:)