OC中链式编程和函数编程思想

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方法,

具体实现就是

  1. 返回一个block,
  2. 我们在block的实现中对我们的未暴露的属性赋值,
  3. 在需要向这个对象“注入”这个属性的时候,调用这个方法,返回block,并在执行此block中传入我们想要注入的参数
  4. 可以是对象,基本数据类型,以及block。

ok,具体好在哪里,我也不知道,需要在以后的编程中慢慢体会。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值