iOS链式编程和函数式编程思想的实践
2019-05-11 本文已影响293人
小生不怕
看了ReactiveCocoa教程的入门篇:《最快让你上手ReactiveCocoa之基础篇》, 里面关于链式编程和函数式思想的讲解,挺通俗易懂的,就是实例贴得不够详尽。所以自己根据理解写了个这两个思想的实践demo。
链式编程思想
- : 链式编程就是将一系列操作(方法的调用),通过点号(.)来链接起来,例如add(1).sub(2).multi(3).divi(4)。
- : 方法的返回值是block。 block必须有返回值并且是该方法的调用对象,block参数是需要操作的值。
-
: masonry框架。
使用masonry布局
利用链式编程思想实现计算器
- 创建CCaculatorMaker类,类似Masonry的MASConstraint角色。
CCaculatorMaker.h
#import <Foundation/Foundation.h>
@class CCaculatorMaker;
// CCaculatorManagerReturnBlock有返回值CCaculatorManager对象,参数为需要操作的数
typedef CCaculatorMaker *_Nonnull(^CCaculatorManagerReturnBlock)(NSInteger);
NS_ASSUME_NONNULL_BEGIN
@interface CCaculatorMaker : NSObject
/** 结果值 */
@property (nonatomic, assign, readonly) NSInteger result;
/**
加方法
@return 返回block
*/
- (CCaculatorManagerReturnBlock)add;
@end
NS_ASSUME_NONNULL_END
CCaculatorMaker.m
#import "CCaculatorMaker.h"
@interface CCaculatorMaker ()
@property (nonatomic, assign) NSInteger result;
@end
@implementation CCaculatorMaker
- (CCaculatorManagerReturnBlock)add {
__weak typeof(self) weakSelf = self;
return ^(NSInteger value){
weakSelf.result += value;
return self;
};
}
@end
- 创建分类NSObject+ChainCaculator.h,这个分类的作用在于构造一个管理者CCaculatorMaker
NSObject+ChainCaculator.h
#import <Foundation/Foundation.h>
#import "CCaculatorMaker.h"
NS_ASSUME_NONNULL_BEGIN
@interface NSObject (ChainCaculator)
+ (NSInteger)makeCaculators:(void(^)(CCaculatorMaker *make))makeBlock;
@end
NS_ASSUME_NONNULL_END
NSObject+ChainCaculator.m
#import "NSObject+ChainCaculator.h"
@implementation NSObject (ChainCaculator)
+ (NSInteger)makeCaculators:(void(^)(CCaculatorMaker *make))makeBlock {
// 1.创建管理者
CCaculatorMaker *maker = [CCaculatorMaker new];
// 2.执行block返回该maker用于链式计算
makeBlock(maker);
return maker.result;
}
@end
- 使用
NSInteger result = [NSObject makeCaculators:^(CCaculatorMaker * _Nonnull make) {
make.add(1).add(2).add(3);
}];
NSLog(@"----------chain \n%zd", result);
函数式编程思想
- : 是把操作尽量写成一系列嵌套的函数或者方法调用。
- : 每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参数为需要操作的值,block返回值是操作的结果。
- : ReactiveCocoa框架。
利用函数式编程思想实现计算器
- 创建FCaculatorMaker类
FCaculatorMaker.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface FCaculatorMaker : NSObject
@property (nonatomic, assign, readonly) NSInteger isEqual;
@property (nonatomic, assign) NSInteger result;
/**
计算
*/
- (FCaculatorMaker *)calculate:(NSInteger(^)(NSInteger))calculateBlock;
/**
是否相等
*/
- (FCaculatorMaker *)equal:(BOOL(^)(NSInteger))operation;
@end
NS_ASSUME_NONNULL_END
FCaculatorMaker.m
#import "FCaculatorMaker.h"
@interface FCaculatorMaker ()
@property (nonatomic, assign) NSInteger isEqual;
@end
@implementation FCaculatorMaker
- (FCaculatorMaker *)calculate:(NSInteger (^)(NSInteger))calculateBlock {
// 调用block把需要操作的值抛出去
_result = calculateBlock(self.result);
return self;
}
- (FCaculatorMaker *)equal:(BOOL (^)(NSInteger))operation {
// 把当前的result传出去做比较
_isEqual = operation(self.result);
return self;
}
@end
- 使用
FCaculatorMaker *FMaker = [FCaculatorMaker new];
// 拿来被比较的数
NSInteger compareResult = 10;
// 最开始的原始值
FMaker.result = 4;
[[FMaker calculate:^NSInteger(NSInteger currentResult) {
// 在这里面做一系列操作
currentResult += 1;
currentResult += 2;
currentResult += 3;
return currentResult;
}] equal:^BOOL(NSInteger result) {
return result == compareResult;
}];
NSLog(@"----------funtional 最终结果:%zd; 是否等于%zd: %zd", FMaker.result, compareResult, FMaker.isEqual);
demo地址: https://github.com/LvBisheng/Learn-iOS(路径为Learn-iOS/Demo/ChainAndFunctionalDemo)