当前位置: 首页 > news >正文

1 RAC解析 自定义链式编程

目的

模仿Masonry连续运用点语法的操作

[self.view mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(@10).offset(1);
    }];
复制代码

写出一个连加的操作

 make.add(10).add(10);
复制代码

想看结果的请直接跳到“最终结果”

分析

一.定义SQMath类

SQMath.h

#import <Foundation/Foundation.h>

@interface SQMath : NSObject

- (NSInteger)result;

- (void)add:(int)number;

@end
复制代码

SQMath.m

#import "SQMath.h"

@interface SQMath ()

@property (nonatomic, assign) NSInteger number;

@end

@implementation SQMath

- (NSInteger)result {
    return self.number;
}

- (void)add:(int)number {
    self.number += number;
}

@end
复制代码

使用这个SQMath的add方法

    SQMath *math = [[SQMath alloc] init];
    [math add:10];
    [math add:20];
    NSLog(@"%ld", [math result]);
复制代码
二.将函数调用改为点语法

如果要用点语法,需要让-add从一个方法变成一个add的属性。但是这样就没有办法传参了

- (NSInteger)add;
复制代码

但是如果返回值是一个 NSInteger (^)(NSInteger) 类型的block就可以了。math.add返回的是这个block,这个block是需要一个NSInteger为参数(加数),返回值是NSInteger(结果)。

SQMath.m

- (NSInteger (^)(NSInteger count))add {
    __weak typeof(self) weakSelf=self;
    NSInteger (^addBlock)(NSInteger) = ^(NSInteger addCount){
        __strong typeof(weakSelf) strongSelf = weakSelf;
        strongSelf.number += addCount;
        return strongSelf.number;
    };

    return addBlock;
}
复制代码

或者

- (NSInteger (^)(NSInteger count))add {
    __weak typeof(self) weakSelf=self;
    return ^(NSInteger addCount) {
        __strong typeof(weakSelf) strongSelf = weakSelf;
        strongSelf.number += addCount;
        return strongSelf.number;
    };
}
复制代码

使用这个SQMath的add方法

    SQMath *math = [[SQMath alloc] init];
    NSLog(@"%ld", math.add(10));
    NSLog(@"%ld", math.add(20));
    NSLog(@"%ld", math.add(30));
复制代码
三.连续使用点语法

只要将Block的返回值更改为self。这样每次add返回的则变成了SQMath的实例对象,这样就可以实现连续点语法的效果了。

- (SQMath* (^)(NSInteger count))add {
    __weak typeof(self) weakSelf=self;
    return ^(NSInteger addCount) {
        __strong typeof(weakSelf) strongSelf = weakSelf;
        strongSelf.number += addCount;
        return self;
    };
}
复制代码

使用这个SQMath的add方法

SQMath *math = [[SQMath alloc] init];
NSLog(@"%ld", math.add(10).add(20).add(30).result) ;
复制代码
四.将这个改为NSNumber的Category

NSNumber+SQMath.h

#import <Foundation/Foundation.h>
#import "SQMath.h"

@interface NSNumber (Math)

- (NSInteger)sq_add:(void(^)(SQMath *make))block;

@end
复制代码

NSNumber+SQMath.m

#import "NSNumber+SQMath.h"

@implementation NSNumber (SQMath)

- (NSInteger)sq_add:(void(^)(SQMath *))block {
    SQMath *math = [[SQMath alloc] init];
    block(math);
    return math.result;
}

@end
复制代码

NSNumber+SQMath 使用

    NSInteger result = [@10 sq_add:^(SQMath * make) {
        make.add(10).add(20);
    }];
    
    NSLog(@"%ld", result);
复制代码

最终结果

SQChainProgramming

ps:链式编程什么时候用我还真不太清楚,但我知道面试的时候肯定有用 哈哈。

相关文章:

  • Cacti 1.2.3 发布,网络流量监测图形分析工具
  • ASP.NET MVC 使用过滤器需要注意
  • Toolbar SearchView的用法
  • 微信小程序video组件层级
  • Node.js 应用故障排查手册 —— 综合性 GC 问题和优化
  • MySQL高性能优化规范建议
  • DES算法的详细使用
  • linux重定向
  • C++磁盘文件排序源码
  • Windows ARM64 运行原生 Chromium,成功
  • 利用ELK分析Nginx日志
  • UVA11468 Substring
  • 第一次实训
  • 基于REDIS实现延时任务
  • sqlserver建立远程查询
  • [NodeJS] 关于Buffer
  • Django 博客开发教程 8 - 博客文章详情页
  • ESLint简单操作
  • golang中接口赋值与方法集
  • HTTP请求重发
  • JavaScript 一些 DOM 的知识点
  • nodejs实现webservice问题总结
  • Python实现BT种子转化为磁力链接【实战】
  • Spark学习笔记之相关记录
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Swoft 源码剖析 - 代码自动更新机制
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 浮动相关
  • 猴子数据域名防封接口降低小说被封的风险
  • 每天一个设计模式之命令模式
  • 浅谈Golang中select的用法
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 入手阿里云新服务器的部署NODE
  • 使用parted解决大于2T的磁盘分区
  • 使用Swoole加速Laravel(正式环境中)
  • 我感觉这是史上最牛的防sql注入方法类
  • 一天一个设计模式之JS实现——适配器模式
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (4)(4.6) Triducer
  • (a /b)*c的值
  • (bean配置类的注解开发)学习Spring的第十三天
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (二)正点原子I.MX6ULL u-boot移植
  • (三)c52学习之旅-点亮LED灯
  • (四)图像的%2线性拉伸
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)负载均衡,回话保持,cookie
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (轉)JSON.stringify 语法实例讲解
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET CF命令行调试器MDbg入门(三) 进程控制