oc中的链式编程和函数编程思想下设置对象属性的小技巧
最近在重拾Swift,经常会接触一些词汇,链式编程和函数编程,其实这些是一种编程思想,能让我们的代码看起来更优雅和一些其他的用处。其实oc中也可以用到用链式编程和函数式编程,下面就从一些实际例子出发,体会一下这种思想。
我们有这样一个需求,为一个对象设置一些属性。拿到这个题目后,so easy,卡卡在.h文件中暴露一些属性。赋值就完了(如下图)
typedef void(^finishBlock)(void);
@interface A : NSObject
@property (nonatomic, copy) finishBlock myfinishBlock;
@property (nonatomic, assign) BOOL isFinish;
@end
@implementation A
@end
A *a = [[A alloc] init];
a.myfinishBlock = ^{
NSLog(@"xxxxxxx");
};
a.isFinish = YES;
有人数这样有问题吗,没问题,这也是我们常用的方式。
那么现在需求变了,让你不能将属性暴露在.h文件中。so easy too,定义一个方法,直接把参数通过方法穿进去就行了
typedef void(^finishBlock)(void);
@interface A : NSObject
- (void)testfuncisFinish:(BOOL)isFinish complete:(finishBlock)finishBlock;
@end
@interface A ()
@property (nonatomic, copy) finishBlock myfinishBlock;
@property (nonatomic, assign) BOOL isFinish;
@end
@implementation A
- (void)testfuncisFinish:(BOOL)isFinish complete:(finishBlock)finishBlock{
self.isFinish = isFinish;
self.myfinishBlock = finishBlock;
}
@end
A *a = [[A alloc] init];
[a testfuncisFinish:YES complete:^{
NSLog(@"xxxxxx");
}];
当然这也是一种解决方案,没有任何问题。
我想说的是第三种方案,来体会链式编程和函数式编程的思想。
typedef void(^finishBlock)(void);
@interface A : NSObject
- (A*(^)(finishBlock finishBlock))finishBlock;
- (A*(^)(BOOL isFinish))isFinish;
- (void)show;
@end
@interface A ()
@property (nonatomic, copy) finishBlock myfinishBlock;
@property (nonatomic, assign) BOOL myisFinish;
@end
@implementation A
- (A *(^)(finishBlock))finishBlock{
return ^A*(finishBlock finishBlock){
self.myfinishBlock = finishBlock;
return self;
};
}
- (A *(^)(BOOL))isFinish{
return ^ A* (BOOL isfinish){
self.myisFinish = isfinish;
return self;
};
}
- (void)show{
NSLog(@"%d",self.myisFinish);
self.myfinishBlock();
}
@end
A *a = [[A alloc] init];
a
.isFinish(YES)
.finishBlock(^{
NSLog(@"xxxxxx");
})
.show;
主要的思路就是在.h中暴露一个方法,这个方法的作用类似于系统的set或者我们自己的set方法,
具体实现就是
- 返回一个block,
- 我们在block的实现中对我们的未暴露的属性赋值,
- 在需要向这个对象“注入”这个属性的时候,调用这个方法,返回block,并在执行此block中传入我们想要注入的参数
- 可以是对象,基本数据类型,以及block。
ok,具体好在哪里,我也不知道,需要在以后的编程中慢慢体会。