iOS函数编程和链式编程(使用block仿Masnory实现)

实在不好意思,题目起的太大了,这里只是对Masnory的实现仿照写一个最简单的demo.把实现思路简单阐述一下,共同进步

各位朋友:源码在demo,可以去看看.

在Masonry中,实现是这样写的:

 UIView *v = [[UIImageView alloc]init];
    v.backgroundColor = [UIColor redColor];
    [self.view addSubview:v];
    
    //使用 Masonry 设置
    [v mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.view).offset(200);
        make.bottom.mas_equalTo(self.view).offset(-200);
        make.left.mas_equalTo(self.view).offset(100);
        make.right.mas_equalTo(self.view).offset(-100);
    }];
    

我们想要实现的效果是:

  1. 我们在使用过程中需要 先执行A方法,再执行B方法,或者先执行B方法,再执行A方法,连写在一起,就是 链式编程
[[某实例对象 A方法] B方法];

或者是:

[[某实例对象 B方法] A方法];

2.在OC中 调用方法都是使用 中括号'[]', 使用小括号'()'的在OC 中是 block,调用block时候用,函数编程

//调用block
block();
//最后实现的效果是:
某实例对象.A方法().B方法();
或者是:
某实例对象.B方法().A方法();

我们一步一步来:

创建一个Person类,自己实现

1>我们先来说实现链式编程

思考: 想要实现链式编程,就是需要 某个实例对象,调用了某个方法,返回的还是这个实例对象本身,这样就能继续调用其他的方法了
在Person.h里:
// 链式语法.   -->就是连续调用,  [[person run] eat],这种.或是[[person eat] run]这种.需要返回值是它本身
-(Person *)run1;
-(Person *)eat1;
在Person.m里:

//下面返回的是其本身,这样就能 使用链式语法,返回还是器本身,就能再继续调用其他的
-(Person *)run1 {
    NSLog(@"%s",__FUNCTION__);

    return self;
}
-(Person *)eat1 {
    NSLog(@"%s",__FUNCTION__);

    return self;
}

在ViewController.m里
 //1 >链式编程,使用链式语法
    [[person run1] eat1];  //可以这样写
    [[person eat1] run1];  //也可以调换顺序,这样写

2 >我们现在来实现函数编程,实现person.eat2()

思考: 想要使用函数编程语法, 就是想办法使用小括号'()'. 在OC中,只有调用block的时候,才会使用'()',所以我们要使得run2这个方法的返回值是block.
在Person.h里:
//函数编程 调用方法使用() 小括号
-(void(^)())run2;
在Person.m里:
-(void (^)())run2 {
    
    //我们要返回的函数是一个block,在外面才能调用 person.run2(),这样写
    void (^runBlock)() = ^{
        NSLog(@"run2");
    };
    
    return runBlock;
}
在ViewController.m里
    //2 >函数式编程:
    person.run2();

3 > 但是 不能继续 person.run3().eat3.

思考:1 > 需要使得第一个方法返回值也是Person,就是本事,self,才能在函数编程的继承上,进行链式编程
2> 实现函数编程基础上的链式编程,需要方法 run3 的返回值是一个block,实现函数编程,在block的内部返回一个Person,实现链式编程
在Person.h里:
// 在使用函数编程编程的 基础上使用 链式编程,需要使得返回值是 本事
-(Person *(^)())run3;
-(Person *(^)())eat3;
在Person.m里:
//3.1 实现函数编程基础上的链式编程,需要方法 run3 的返回值是一个block,实现函数编程,在block的内部返回一个Person,实现链式编程
-(Person *(^)())run3 {
    Person *(^runBlock)() = ^{
        NSLog(@"--run3");
        return self;
    };
    return runBlock;
}
// 3.2 我们把3.1 内部的实现再写成一步
-(Person *(^)())eat3 {
    
    return ^{
        NSLog(@"-eat3");
        return self;
    };
}
在ViewController.m里
    
    person.run3().eat3(); //可以这样 先跑后吃
    person.eat3().run3(); //也可以这样,先吃后跑
4 > 但是还是不能像Masnory那样有参数,我们再改造.
在Person.h里:
//Person *(^)(double) --> Person *是block的返回值. (double)是参数
-(Person *(^)(double))run4;        
-(Person *(^)(NSString *))eat4;
在Person.m里:

// 4 我们需要使得block带参数,这样才能有跟Masnory那样 equalTo(self).offset(20);的效果
-(Person *(^)(double))run4 {
    
    //*** '大的返回值'是 这个 run4的返回值.  '小的返回值'-->'内部的返回值'是run4的返回值那个block的返回值
    return ^(double distance){
        NSLog(@"run4,%f",distance);
        
        return self;
    };
}
-(Person *(^)(NSString *))eat4 {
    
    return ^(NSString * food){
        NSLog(@"eat4 %@",food);
      
        return self;
    };
}
在ViewController.m里
    person.run4(100).eat4(@"面包");
    
    person.eat4(@"大米饭").run4(300);

但是,发现这样写block,实在是一种痛苦,还是使用typedef来实现吧:(这就是所谓的先苦后甜吧)

在Person.h里:
@class Person;

typedef Person *(^myRunblock)(double distance);   //这个distance,可以省略不写
typedef Person *(^myEatblock)(NSString *);
....
//5, 使用起别名的block,进行函数编程和链式编程
-(myRunblock)run5;
-(myEatblock)eat5;
在Person.m里:
// 使用起别名的block 再进行 函数编程和链式编程,比较方便
-(myRunblock)run5 {
  
    return ^(double distance){
        NSLog(@"run5 %f",distance);
        
        return self;
    };
}

-(myEatblock)eat5 {

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

推荐阅读更多精彩内容