美文网首页超棒文集链式编程
函数式编程,链式编程

函数式编程,链式编程

作者: 龙龙_caa0 | 来源:发表于2017-03-22 16:19 被阅读65次

导语

在使用Masonry的时候,一直很好奇作者是怎么写出这么优雅的代码的,自己也学习了一下函数式编程的思想,以上为索引


函数式编程和链式编程在Masonry的使用

    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
    [redView makeConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(self.view).offset(0);
        make.width.height.equalTo(200);
    }];

上面这段代码是创建了一个view并添加到父视图上面,可以看到使用Masonry一句话就可以设置几句约束,代码看起来很优雅
上面涉及到两个概念函数式编程 equalTo(self.view)链式编程 (多个方法调用呈现链式的一次性调用)


如何自己在项目中实现

首先在项目里面创建一个Person类,在里面实现对象方法run 和 eat两个方法,并且在控制器声明调用这两个方法

- (void)eat {
    NSLog(@"%s",__func__);
}
- (void)run {
    NSLog(@"%s",__func__);
}
 Person *person = [[Person alloc] init];
    [person eat];
    [person run];
这种写法的缺点:
        * 1 方法需要分开来调用
        * 2 不能实现想让对象吃一种东西,跑另外一种东西的任意混合调用

链式编程的实现

给eat和run方法一个返回值

- (Person *)eat1 {
    NSLog(@"%s",__func__);
    return self;
}
- (Person *)run1 {
    NSLog(@"%s",__func__);
    return self;
}
    [[person run1] eat1];

实现了链式编程,接下来看函数式编程的实现原理

函数式编程的实现
- (void(^)())run2 {
    void(^block)() = ^() {
        NSLog(@"人在跑");
    };
    return block;
}
    [person run2]();
考虑到run2可以看做是一个get方法可以写成下面这个样子
    person.run2();

简单的函数式编程实现了

函数编程配合链式编程的实现

- (Person *(^)())run3 {
    Person* (^block)() = ^() {
        NSLog(@"人在跑3");
        return self;
    };
    return block;
}
- (Person *(^)())eat3 {
    Person* (^block)() = ^() {
        NSLog(@"人在吃2");
        return self;
    };
    return block;
}
    person.run3().eat3().run3().eat3();

上面实现了函数式和链式编程

模仿masonry的函数式编程和链式编程

- (Person *(^)(NSString *))eat4 {
    Person *(^block)(NSString *) = ^(NSString *foodName) {
        NSLog(@"人在吃4");
        return self;
    };
    return block;
}
- (Person *(^)(int))run4 {
    Person *(^block)(int) = ^(int juLi) {
        NSLog(@"人在跑4");
        return self;
    };
    return block;
}
    person.eat4(@"麻辣火锅").run4(4).eat4(@"黄焖鸡米饭").run4(10);

这样的代码是不是和Masonry很像了?


总结:下面复制一段Masonry的代码来看下基本就是这种思路.熟悉了这种编程思想接可以让自己写的代码或者优雅并且逼格高一点,并且阅读其他人的框架时候帮助也会很大

- (MASConstraint * (^)(id))mas_equalTo {
    return ^id(id attribute) {
        return self.equalToWithRelation(attribute, NSLayoutRelationEqual);
    };
}
- (MASConstraint * (^)(id))greaterThanOrEqualTo {
    return ^id(id attribute) {
        return self.equalToWithRelation(attribute, NSLayoutRelationGreaterThanOrEqual);
    };
}
- (MASConstraint * (^)(id))mas_greaterThanOrEqualTo {
    return ^id(id attribute) {
        return self.equalToWithRelation(attribute, NSLayoutRelationGreaterThanOrEqual);
    };
}
- (MASConstraint * (^)(id))lessThanOrEqualTo {
    return ^id(id attribute) {
        return self.equalToWithRelation(attribute, NSLayoutRelationLessThanOrEqual);
    };
}

github演示项目----函数式编程和链式编程

相关文章

  • iOS-链式编程

    函数式编程------->链式编程 函数式编程: 调用方式 我们最终目的是将函数式编程转换为链式编程:首先将调用方...

  • iOS 函数编程 & 链式编程

    函数式(链式)编程 函数式编程概念 函数式编程是种编程范式 函数式编程 Functional Programmin...

  • ReactiveObjC入门

    ReactiveObjC基础用法 iOS开发三种编程方式(响应式编程、函数编程、链式编程),函数编程最常用,链式编...

  • iOS链式编程及函数式编程

    提到链式编程和函数式编程,最典型的代表是Masonry 比较完美的实现了函数式编程和链式编程。例如 ``` [vi...

  • iOS链式、函数式和响应式编程

    原文编程思想-iOS链式、函数式和响应式编程 在了解链式、函数式和响应式编程前,我们需要回顾下Block,它在下面...

  • 工作iOS技术总结

    链式编程、函数式、面向接口编程思想 iOS 之ReactiveCocoa 链式编程2 WKWebView的缓存处理...

  • 链式编程与函数编程

    1. 链式编程 2. 函数式编程 例子:

  • 函数式编程 响应式编程

    学习函数式编程对于我们理解Masonry && Snapkit有很大的帮助,函数式编程(链式编程)。下面文章也是参...

  • iOS-Main-链式编程和函数式编程体验

    Masonry 经典的代表链式编程和函数式编程 思考,怎么样创建一个自己的函数式或链式编程呢? 创建项目,并搞一个...

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

    最近看到了链式编程和函数式编程这两个概念,这两天不是那么的忙 所以也研究了下这两个概念;在查询链式编程和函数式编程...

网友评论

本文标题: 函数式编程,链式编程

本文链接:https://www.haomeiwen.com/subject/oksonttx.html