欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS-链式编程

程序员文章站 2022-07-28 21:24:13
链式编程思想:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。a(1).b(2).c(3) 链式编程特点:方法的返回值是block,block必须有...

链式编程思想:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。a(1).b(2).c(3)

链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)

代表:masonry框架。

BabyBluetooth
Masonry中的链式可能相对比较零散,并不能体现出链式的任务逻辑连贯性。

下面介绍另外一个优秀的第三方框架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);
}