美文网首页还不懂的iOS开发笔录程序员
iOS开发探索-链式编程实践与分析

iOS开发探索-链式编程实践与分析

作者: 零距离仰望星空 | 来源:发表于2016-02-26 15:44 被阅读353次

我们经常使用的开源框架 Masonry 就是使用这样的编程思想,Masonry是一个OC开发中,非常好用的自动布局框架,通过点语法来进行多个操作

代码示例:

[greenView makeConstraints:^(MASConstraintMaker *make) {
    make.top.greaterThanOrEqualTo(superview.top).offset(padding);
    make.left.equalTo(superview.left).offset(padding);
    make.bottom.equalTo(blueView.top).offset(-padding);
    make.right.equalTo(redView.left).offset(-padding);
}];

这种将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性提高,我们称之为链式编程

链式编程特点:方法的返回值是block,block必须返回对象本身(返回block时,block所在的方法调用者对象)block的参数是需要操作的值。

下面通过一个简单的示例解读链式编程,展示链式编程的魅力。

1. 创建Person类

person.h 头文件
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (Person* (^)())eat;
- (Person* (^)())go;
- (Person* (^)(NSString *))study;
@end

person.m 实现文件
#import "Person.h"
@implementation Person

//该函数返回一个 Person* (^)() 类型的 block 变量,当该类对象调用 block() 会打印eat 并且返回该当前类对象
- (Person* (^)())eat
{
    //block变量保存的代码段
    Person* (^block)() = ^(){
        NSLog(@"eat");
       //返回当前类对象
        return self;
    };
   //返回block变量
    return block;
}
- (Person* (^)())go
{
    return ^Person *(){
        NSLog(@"go go go");
        return self;
    };
}
//该函数返回一个 Person* (^)(NSString *) 类型的 block 变量
- (Person* (^)(NSString *))study
{
    Person* (^block)(NSString *) = ^(NSString *yyy){
        NSLog(@"%@ study",yyy);
        return self;
    };
    return block;
}
@end

2. 调用示例:

Person *person = [Person new];
person.eat().go().study(@"good good");

3. 输出结果:

2016-02-26 14:37:06.179 Day2016-02-26-函数编程[2579:87725] eat 2016-02-26 14:37:06.180 Day2016-02-26-函数编程[2579:87725] go go go 2016-02-26 14:37:06.180 Day2016-02-26-函数编程[2579:87725] good good study

4. 分析:

分解以上调用的代码
第一步:执行 person.eat 返回对应的eatBlock变量。
Person* (^eatBlock)() = person.eat;
第二步:执行eatBlock,此时返回当前person对象。
person = eatBlock();
第三步:执行 person.go 返回对应的goBlock变量。

Person* (^goBlock)() = person.go;

第四步:执行goBlock,此时返回当前person对象。
person = goBlock();
第五步:执行 person.study 返回对应的studyBlock变量。
Person* (^studyBlock)(NSString *) = person.study;
第六步:执行studyBlock,此时返回当前person对象。
person = studyBlock(@"good good");

按照分解步骤调用实现:

Person *person = [Person new];
Person* (^eatBlock)() = person.eat;
person =  eatBlock();
Person* (^goBlock)() = person.go;
person =  goBlock();
Person* (^studyBlock)(NSString *) = person.study;
person =  studyBlock(@"good good");

输出结果:
2016-02-26 15:40:34.371 Day2016-02-26-函数编程[2948:107876] eat 2016-02-26 15:40:34.371 Day2016-02-26-函数编程[2948:107876] go go go 2016-02-26 15:40:34.372 Day2016-02-26-函数编程[2948:107876] good good study

这样就可以一直链接下去吧!实现了我们想要的目标!

5. 函数式编程总结

如果想再去调用别的方法,那么就需要返回一个对象;
如果想用()去执行,那么需要返回一个block;
如果想让返回的block再调用对象的方法,那么这个block就需要返回一个对象(即返回值为一个对象的block)

扫描下方二维码关注我###

零距离仰望星空

在此感谢各位读者的来访,您的关注是我写作分享的最大动力。

相关文章

  • iOS开发探索-链式编程实践与分析

    我们经常使用的开源框架 Masonry 就是使用这样的编程思想,Masonry是一个OC开发中,非常好用的自动布局...

  • ReactiveObjC入门

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

  • iOS 开发探索-链式编程实战

    "天下武功,无快不破",求上天眷顾,愿各位技术大神来打通我的任督二脉,从此启动开挂模式,在技术进阶之路上狂奔. 最...

  • ios开发-链式编程

    什么是链式编程,我看到这个东西第一反应,这不就是一个装饰模式嘛,其实我的理解,链式编程就是一个写法特别的装饰模式,...

  • 工作iOS技术总结

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

  • iOS开发Masonry框架源码解析

    iOS开发Masonry框架源码解析 前言:这个框架编程思想主要包括链式编程 这是一个iOS在控件布局中的轻量级框...

  • RAC学习详解

    Block开发基础知识 链式编程思想简介 响应式编程思想简介 函数式编程思想简介 参考资料 iOS 关于MVC和M...

  • 链式编程总结

    链式编程总结 @(iOS) 研究了一下链式编程,但是感觉项目中用处不是很多。 介绍 1.什么时候使用链式编程?在面...

  • 使用链式编程开发iOS

    有一句话叫三人行必有我师,其实作为一个开发者有一个学习的氛围跟一个交流圈子特别重要,这是我的一个iOS交流群686...

  • iOS开发之链式编程

    很多小伙伴在开发的过程当中会见到一个很神秘的词--链式编程,那么到底什么是链式编程,链式编程到底有什么神奇之...

网友评论

    本文标题:iOS开发探索-链式编程实践与分析

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