看这篇博客时最快让你上手ReactiveCocoa之基础篇看到作者介绍链式编程那一块,发现自己的钻研精神不足。想想自己使用链式编程也有段时间了,对,就是 Masonry 库。自己一直享受点语法带来的效率提升,却没想过自己去照着实现一下,真是惭愧。

好吧,本着发现问题就要立即解决问题的一贯原则,就看一看链式语法的实现方法。

现在做一个加减乘除计算。

在 Masonry 里,我们常用的添加约束的方法就是 mas_makeConstraints:

// View+MASAdditions
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
self.translatesAutoresizingMaskIntoConstraints = NO;
MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
block(constraintMaker);
return [constraintMaker install];
}

在约束里,用到 left, right 等是 constraintMaker 的属性,最后设置参数,比如 offset() 是 MASConstraint 的方法:

//MASConstraintMaker
@property (nonatomic, strong, readonly) MASConstraint *left; - (MASConstraint *)left {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeft];
} //MASConstraint
- (MASConstraint * (^)(CGFloat offset))offset; - (MASConstraint * (^)(CGFloat))offset {
return ^id(CGFloat offset){
self.offset = offset;
return self;
};
}

所以源码大概的结构是这样。然后就要实现我们的计算器了。

//NSObject+Extension
@implementation NSObject (Calculator) - (CGFloat)makeCalculators:(void (^)(CalculatorMaker *))block {
CalculatorMaker *mgr = [[CalculatorMaker alloc] init]; block(mgr); return mgr.result;
} @end //CalculatorMaker.h
@interface CalculatorMaker : NSObject @property (nonatomic, assign) int result; - (CalculatorMaker *(^)(int)) add;
- (CalculatorMaker *(^)(int)) sub;
- (CalculatorMaker *(^)(int)) mul;
- (CalculatorMaker *(^)(int)) div; @end //CalculatorMaker.m
@implementation CalculatorMaker - (CalculatorMaker *(^)(int))add {
return ^CalculatorMaker *(int value) {
_result += value;
return self;
};
} - (CalculatorMaker *(^)(int))sub {
return ^CalculatorMaker *(int value) {
_result -= value;
return self;
};
} - (CalculatorMaker *(^)(int))mul {
return ^CalculatorMaker *(int value) {
_result *= value;
return self;
};
} - (CalculatorMaker *(^)(int))div {
return ^CalculatorMaker *(int value) {
_result /= value;
return self;
};
} @end //main.m
int result = [NSObject makeCalculators:^(CalculatorMaker *make) {
make.add(1).add(5).mul(2);
}];
//output 12

看 add() 方法,返回类型是自身所在 CalculatorMaker 类型的 Block,而 Block 返回的也是 self,所以可以连续使用链式调用。不过关于为什么可以用点语法,这个我有点晕,按说 make.add 是 OC 语法,后面括号跑到 Block 里去。那对于 OC 语法来说,点语法是针对 getter 方法的,对于没有参数的非 getter 方法也可以调用,但调用时会报 warning ,所以这点不是很懂。

关于链式调用的写法,有点秀技术的感觉。视情况而用。不过,鉴于 Masonry 作者能写出这么有技巧的代码,我觉得有必要研究一下 Masonry 源码了。

[Objective-C]用Block实现链式编程的更多相关文章

  1. 第四十一篇、Masonry利用Block实现链式编程

    一直都觉得使用Masonry的时候语法特别优雅,很早的时候就想尝试下怎么实现, 一直都没弄明白,直到最近看见一篇叫block实现链式编程的 1.方法的返回类型是代码块 >代码块的返回类型是该类的 ...

  2. iOS利用block实现链式编程方法(Objective-C链式编程)

    objc利用block实现链式编程方法 因为不好读.block和其他语言的匿名函数一样,很多程序员刚开始很难主动去用他. 本文描述block作为属性的实际使用,看懂block,并讲解如何利用block ...

  3. (一一八)利用block实现链式编程

    有些时候需要不断地调用方法,如果使用传统方案,需要拿到对象多次调用,例如有一个Ball对象,实现了up.down.left.right四个方法,分别控制球的运动方向,如果要实现球向右再向下,需要这么写 ...

  4. AJ学IOS 之BLOCK的妙用_利用block实现链式编程

    AJ分享,必须精品 一:场景 我们有个对象人,他有两个方法,一个是学习study,一个是跑步run, 这个人有个怪癖,跑完步之后必须学习,为了实现这个方法并且能调用方便,我们让跑步和学习都回返回自己这 ...

  5. 新浪微博客户端(63)-使用block进行链式编程

    Person.h #import <Foundation/Foundation.h> @interface Person : NSObject - (Person *(^)())study ...

  6. ios的链式编程笔记

    1.Masonry的语法为啥能连续的使用点语法? >> 底层使用的是:用block当函数的返回参数  > 链式编程思想 2. 使用block当函数的返回参数 // 之前开发中比较习惯 ...

  7. iOS开发技巧系列---使用链式编程和Block来实现UIAlertView

    UIAlertView是iOS开发过程中最常用的控件之一,是提醒用户做出选择最主要的工具.在iOS8及后来的系统中,苹果更推荐使用UIAlertController来代替UIAlertView.所以本 ...

  8. iOS:用Block写一个链式编程

    一.介绍 链式编程是一个比较新颖的编程方式,简单直观,用起来也比较舒服.目前比较有名的Mansory和BabyBlueTooth就是使用链式编程写的第三方框架. 二.写法 链式编程写法不同于传统方式, ...

  9. iOS 链式编程探索(Masonry)

    看了几篇关于链式编程的文章,还是理解的不透彻,我想这可能是因为我自己对block掌握的不熟练. 我已经明白了,所以,和大家分享一下我的理解!如有问题,麻烦大家指出! 直接看代码吧!关键的注释都有. 我 ...

随机推荐

  1. 【Spark调优】Kryo序列化

    [Java序列化与反序列化] Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程.序列化使用场景:1.数据的持久化,通过序列化可以把数据永久 ...

  2. 【sping揭秘】25、Spring远程方案

    分化:RMI,EJB,Hessian Spring有 Rmi,http,hessian,burlap 基于rmi的remoting方案 RMI要求远程类对象包路径和本地一致 基于HTTP的轻量级rem ...

  3. 原生js ajax请求

    什么是ajax AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新. 这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新, ...

  4. Talk In Web Security(安全世界观): Devleping a Secure WebSite

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. Why to write about Web ...

  5. vue-13-swiper组件的使用

    vue-13-swiper 是一个滑动库, 非常丰富的滑动样式, 轮播图等 https://www.swiper.com.cn https://github.com/surmon-china/vue- ...

  6. 使用awk和sed获取文件奇偶数行的方法总结

    测试文件test.file [root@localhost ~]# cat test.file 111111111111111 222222222222222 333333333333333 4444 ...

  7. Tomcat他山之石.可以攻玉(一)Server组件

    Server组件 Server组件作用: 采用观察者模式,又叫源-收听者的设计模式,提供了可以动态添加.删除的监听器,作用是在Server组件的不同生命周期中完成不同的功能.逻辑: Tomcat容器的 ...

  8. 【Vue.js】基于vue的实时搜索,在结果中高亮显示关键词

    一.搜素效果如下: 二.核心 1)利用oninput属性来触发搜素功能 2)利用RegExp来对字符串来全局匹配关键字,利用replace方法来对匹配的关键字进行嵌入高亮的<span class ...

  9. 第三方工具系列--Lombok常用注解

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9329798.html Lombok注解解析: @NonNull 使用在方法的参数或者构造 ...

  10. pxe+kickstart自动化批量安装系统详解-技术流ken

    前言 pxe+kickstart是一款可以实现自动化批量安装系统的服务,比较经典,下面将详细介绍此服务的安装和使用. 系统环境准备 系统版本:CentOS release 6.7 (Final) 内网 ...