1.什么是鏈?zhǔn)剑ê瘮?shù)式)編程秀鞭?
通過高階函數(shù)以點(diǎn)為連接將多個(gè)函數(shù)連接在一起完成參數(shù)傳遞和復(fù)雜的操作姓迅!
例如在Masonry中的這樣的代碼
make.right.equalTo(self.right).insets(kPadding);
分析不難得出
1与境、一個(gè)實(shí)例方法后面可以接括號(hào)拼接參數(shù)琳骡,那么可以判斷當(dāng)前實(shí)例方法返回值應(yīng)該是一個(gè)block7妨浴(block 是一種特殊的函數(shù))
2泌神、make.right.equalTo(self.right) 后面可以接著調(diào)用實(shí)例方法 可以分析出這個(gè)表達(dá)式返回值應(yīng)該是一個(gè)該類的實(shí)例 也就是說 block的返回值是該類的實(shí)例變量
通過上面的分析 看看代碼
#import <Foundation/Foundation.h>
@interface Calculate : NSObject
@property(nonatomic,assign)NSInteger result;//計(jì)算結(jié)果
-(Calculate *)clear;//清零
-(Calculate *)printResult;//打印結(jié)果
-(Calculate * (^)(NSInteger))add;//在結(jié)果上加
-(Calculate *(^)(NSInteger))sub;//在結(jié)果上減
@end
要想實(shí)例方法可以通過點(diǎn)方式連接起來定血,那么 1电爹、返回值定位該類的一個(gè)實(shí)例 2恢筝、必須用將調(diào)用方法的結(jié)果存儲(chǔ)起來(這里是聲明一個(gè)全局變量來存儲(chǔ)計(jì)算的結(jié)果)
.m文件函數(shù)的實(shí)現(xiàn)部分
#import "Calculate.h"
@implementation Calculate
-(instancetype)init{
if (self = [super init]) {
self.result = 0;
}
return self;
}
-(Calculate *)clear{
self.result = 0;
return self;
}
-(Calculate *)printResult
{
NSLog(@"計(jì)算結(jié)果:%ld\n",self.result);
return self;
}
-(Calculate *(^)(NSInteger))add
{
return ^(NSInteger i){
self.result += i;
return self;
};
}
-(Calculate *(^)(NSInteger))sub{
return ^(NSInteger i){
self.result -= i;
return self;
};
}
@end
add函數(shù)的返回值是一個(gè) block 哀卫, 這個(gè)block的返回這是一個(gè)該類的實(shí)例 ,block的參數(shù)則為需要處理的數(shù)據(jù)滋恬,block的實(shí)現(xiàn)是處理過程聊训!
下面是調(diào)用代碼
Calculate *cal = [[Calculate alloc]init];
cal.add(5).add(8).printResult.sub(2).printResult.clear.printResult;
可以看到計(jì)算多個(gè)數(shù)據(jù)可以通過一條連接來順利完成讓調(diào)用者更加方便!
將調(diào)用放在一個(gè)語句塊中來實(shí)現(xiàn)
[scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(weakSelf.view).insets(UIEdgeInsetsMake(20, 10, 10, 10));
}];
從代碼中可以看出 函數(shù)mas_makeConstraints的參數(shù)是一個(gè)block類型
+(NSInteger)markCalculate:(void (^)(Calculate *))block
{
//創(chuàng)建管理計(jì)算者
Calculate *cal = [[Calculate alloc]init];
//給參數(shù)賦值
block(cal);
return cal.result;
}
調(diào)用
NSInteger result = [Calculate markCalculate:^(Calculate *make) {
make.add(10).sub(3).add(2).add(198).printResult;
}];
高階函數(shù)的使用主要是方便調(diào)用者恢氯,這些都可以通過一階函數(shù)實(shí)現(xiàn)并且簡單带斑!
(如有高見敬請(qǐng)留言,學(xué)習(xí)路上 三人行必有我?guī)煟勋拟。?/p>