iOS-链式编程
程序员文章站
2022-04-03 17:11:29
链式编程思想:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。a(1).b(2).c(3)
链式编程特点:方法的返回值是block,block必须有...
链式编程思想:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。a(1).b(2).c(3)
链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)
代表:masonry框架。
BabyBluetoothMasonry中的链式可能相对比较零散,并不能体现出链式的任务逻辑连贯性。
下面介绍另外一个优秀的第三方框架BabyBluetooth,BabyBluetooh是简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容ios和mac osx。
CoreBluetooth所有方法都是通过委托完成,代码冗余且顺序凌乱。BabyBluetooth使用block方法,可以重新按照功能和顺序组织代码,并使用链式编程将一组任务用一条链完成。
baby.having(self.currPeripheral).and.channel(channelOnPeropheralView).then.connectToPeripherals().discoverServices().discoverCharacteristics().readValueForCharacteristic().discoverDescriptorsForCharacteristic().readValueForDescriptors().begin();
用一条链就完成了一整套的连接peripheral,发现服务,发现特性,读取特性值,发现描述,读取描述值的任务链,而不需要多次的分散调用,流程逻辑非常清晰。
下面用链式编程思想写一个Demo
以分类形式进行计算操作
.h
#import @class CalculateManager; @interface NSObject (Calculate) +(NSInteger)xw_makeCalculate:(void(^)(CalculateManager *))block; @end
.m
#import "NSObject+Calculate.h" #import "CalculateManager.h" @implementation NSObject (Calculate) +(NSInteger)xw_makeCalculate:(void(^)(CalculateManager *))block{ CalculateManager *mgr = [[CalculateManager alloc] init]; block(mgr); return mgr.result; } @end
自定义计算类,使所有方法用block代码块形式表示
.h
#import @interface CalculateManager : NSObject @property (nonatomic, assign) NSInteger result; -(CalculateManager *(^)(NSInteger))add; -(CalculateManager *(^)(NSInteger))subtract; -(CalculateManager *(^)(NSInteger))mult; -(CalculateManager *(^)(NSInteger))pision; @end
.m
#import "CalculateManager.h" @implementation CalculateManager -(CalculateManager *(^)(NSInteger))add{ return ^(NSInteger value){ _result += (value); return self; }; } -(CalculateManager *(^)(NSInteger))subtract{ return ^(NSInteger value){ _result -= (value); return self; }; } -(CalculateManager *(^)(NSInteger))mult{ return ^(NSInteger value){ _result *= (value); return self; }; } -(CalculateManager *(^)(NSInteger))pision{ return ^(NSInteger value){ _result /= (value); return self; }; } @end
在使用链式编程思想调用对象方法就可以这样操作:
-(void)calculate{ NSInteger result = [NSObject xw_makeCalculate:^(CalculateManager * mgr) { mgr.add(100).add(200).pision(2).mult(3).subtract(50).add(121); }]; NSLog(@"result: %zd",result); }