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

最近看到了链式编程和函数式编程这两个概念,这两天不是那么的忙 所以也研究了下这两个概念;
在查询链式编程和函数式编程的概念时突然想到了链式编程和函数式编程最典型的代表是Masonry 比较完美的实现了函数式编程和链式编程 例如

[viewOne mas_makeConstraints:^(MASConstraintMaker *make) {

        make.top.equalTo(self.view).offset(100);

        make.centerX.equalTo(self.view.mas_centerX).offset(100);

        make.height.mas_equalTo(100);

        make.width.mas_equalTo(100);

    }];

其实 仔细考虑了下 所谓的链式编程其实就是 在返回值的基础上 继续调用方法,那么问题来了 什么样的返回值才能调用方法 答案是 对象 只要返回对象 然后调用对应的对象方法即可实现 链式编程 例如 最简单的链式编程

- (Person *(^)())eat3;

- (Person *(^)())run3;

[[person eat] run];

这样的链式编程 和Masonry 确实有点相差甚远

我们知道在OC中的方法调用是 发送消息的方式实现的那么 要实现 person.eat 该怎么实现呢?

那么我们就想到了 Xcode的编译器特性 类似于 getter 和setter方法,尤其是getter方法 就是将 NSString *nameOne = peron.name 转化成了 NSString *nameOne = [peron name] 那么类似的做法 我们是不是可以将 方法调用写成 : person.eat呢?答案是可以的 但是这样是有警告的但是 可以运行 那么只要我的eat 方法的返回值是Person 类对象 那么我就可以实现链式编程 ,但是这样写又没有什么意义,我们观察Maronry中是将函数式编程和链式编程结合起来使用的那么我们先了解下OC中的函数式编程的实现

先介绍下 函数式编程 然后慢慢过渡到链式编程

首先所谓函数式编程 就是通过类似于 函数调用的方式实现想要的功能即 method(); 这样的方式,

那么我们知道在OC能用method() 这样调用,只有一个可以实现,那就是BLOCK, 我们在调用BLOCK时 不就是这样调用的吗? 那么我们知道只要我的一个方法的返回值是BLOCK的时候就可以使用函数式调用了例如

- (void(^)())eat2;

- (void(^)())run2;

- (void (^)())eat2 {
    return ^{
        NSLog(@"block === %s",__func__);
    };
}
- (void (^)())run2 {
    return ^(){
        NSLog(@"block == %s",__func__);
    };
}
但是这样具有局限性就是只能调用一次

person.eat2();

person.run2();

不能实现 person.eat2().run2();

那么我们猜想了只要eat2中block的返回值是Person类对象 是不是就可以实现了呢?

于是 测试例子

- (Person *(^)())eat3;

- (Person *(^)())run3 ;

- (Person *(^)())eat3 {
    return ^(){
         NSLog(@"block == %s",__func__);
        returnself;
    };
}

- (Person *(^)())run3 {
    return ^{
        NSLog(@"block ==== %s",__func__)
        returnself;
    };
}

此时就可以实现 person.eat3().run3(); 此时距离Masonry的样式就越来越接近了

那么我们知道 无论是eat3还是run3 的返回值是 返回Person类型的block,当我们 person.run3()时就是调用了run3返回回来的block,那么我们知道了 当我们返回的block中带有参数 是不是就可以实现person.run3(参数).eat3(参数);

于是:

- (Person *(^)(NSString *food))eat4{
      return ^(NSString *food){
      NSLog(@"吃了%@",food);
      return self;
};
}
- (Person *(^)(int distance))run4 {
  return ^(int distance){
  NSLog(@"跑了%d米",distance);
  return self;
    };
}

这样就可以实现 
 NSLog(@"=========");
    person.eat4(@"大骨头").run4(10000);
    NSLog(@"=========");
    person.run4(200000).eat4(@"小鱼");
了  
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容