Object-C 关于「链式编程」与「函数式编程」简单实践
第一次来「掘金」发文章~
「函数式编程」:每个函数都有返回,函数作为第一类对象 「链式编程」:函数返回的对象继续进行函数,组成一串长链(函数式编程的体现?)
- 拿 jQuery 简单举个例子
var text = $('#content').children().eq(1).children().eq(0).text();
复制代码
- 对比 Object-C,
// 执行方法,而不是函数,没有返回,虽然参数部分有返回,但是毕竟是面向对象[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:NSStringFromClass([UITableViewCell class])];// 就算使用返回 self,写链式也很难受[[[person eat] run] eat];
复制代码
OC 实现「函数编程」与「链式编程」
.
语法使用,是对象属性- 使属性拥有参数,需要 block 函数闭包作为属性
// 定义 block
typedef Person* (^eatBlock)(NSString *name);
// block 作为属性
@property (nonatomic, copy) eatBlock eat;
// block 的 getter 方法,本身是函数,可以引入参数,而函数又返回 self,得以继续
- (eatBlock)eat {return ^Person* (NSString *a) {NSLog(@"吃了:%@",a);return self;};
}Person *person = [[Person alloc] init];
person.eat(@"苹果").eat(@"橘子").eat(@"香蕉");
复制代码
抛开实例,只关注函数结果
- 可以把实例本身封装起来
NSString *resMessage = [Person makeMessage:^(Person *person) {person.eat(@"橘子").run(12).pause.eat(@"苹果");}];
复制代码
- 部分代码
@implementation Person- (NSMutableArray *)infoList {if (!_infoList) {_infoList = [NSMutableArray array];}return _infoList;
}+ (NSString *)makeMessage:(void(^)(Person *person))block {if (block) {Person *person = [[Person alloc] init];block(person);return [person.infoList componentsJoinedByString:@","];}return nil;
}- (eatBlock)eat {return ^Person* (NSString *a) {NSLog(@"吃了:%@",a);[self.infoList addObject:[NSString stringWithFormat:@"吃了 %@", a]];return self;};
}- (runBlock)run {return ^Person *(NSInteger step) {NSLog(@"走了:%zi 步", step);[self.infoList addObject:[NSString stringWithFormat:@"走了 %zi 步", step]];return self;};
}- (Person *)pause {NSLog(@"休息一下");[self.infoList addObject:@"休息以下"];return self;
}
@end
复制代码
Demo 地址
block 回顾
内部 block
// 定义方法
- (NSInteger)sumWithA:(NSInteger)a b:(NSInteger)b {return a + b;
}// 定义 block
NSInteger (^sum)(NSInteger, NSInteger) = ^(NSInteger a, NSInteger b) {return a + b;
};NSInteger res1 = [self sumWithA:1 b:2];
NSInteger res2 = sum(1, 2);
复制代码
实例 block
@property (nonatomic, copy) NSInteger(^block)(NSInteger a, NSInteger b);self.block = ^(NSInteger a, NSInteger b) {return a + b;
}; NSInteger res = self.block(1, 2);
复制代码
block 的 getter 与 setter
typedef NSInteger(^typeOfBlock)(NSInteger a, NSInteger b);
@property (nonatomic, copy) typeOfBlock typeBlock;
复制代码
getter
- 实际获取了 block 函数本身,可以当成函数使用(向里传参)
- (typeOfBlock)typeBlock {return ^NSInteger(NSInteger a, NSInteger b) {return a + b;// 此处是 block 函数执行体};
}NSInteger res4 = self.typeBlock(2, 3);
复制代码
setter(正常实例)
- 给实例指定 block 函数(与实例一样的 get 和 set)
- 这个应该不怎么用吧,仅仅把函数执行体,放到外面而已
- (void)setTypeBlock:(typeOfBlock)typeBlock {if (!_typeBlock) {_typeBlock = typeBlock;}
}[self setTypeBlock:^NSInteger(NSInteger a, NSInteger b) {return a + b;// 此处是 block 函数执行体
}];
复制代码
setter 2(内部调用)
- 内部使用了 block,即可反向传参,因为执行体在外面(向外传参)
- 这个很多时候用来代替了 delegate 传参的方式
- (void)setTypeBlock:(typeOfBlock)typeBlock {if (typeBlock) {NSInteger res = typeBlock(2, 3);// 实际就是执行了 block 函数一次,但作用可以反向传参NSLog(@"这里是 res:%zi", res);}
}[self setTypeBlock:^NSInteger(NSInteger a, NSInteger b) {NSLog(@"%zi,%zi", a, b);return a + b;// 此处是 block 函数执行体
}];
复制代码
Object-C 关于「链式编程」与「函数式编程」简单实践相关推荐
- WebFlux响应式编程基础之 2 函数式编程 工具jclasslib bytecode viewer
函数式编程:告诉他的功能是什么,而不是告诉他怎么做 命令式编程:怎么去做 函数式编程:不需要关注细节,利用系统已经有的API 使用jdk8自带函数接口的好处 函数接口减少接口定义 函数式接口链式操作 ...
- SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理
SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理 本文连接 简介 SIGIA_4P 网址 a. 课程OKR Objectives and ...
- 高阶函数||编程范式: 命令式编程/声明式编程 || 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数)
编程范式: 命令式编程/声明式编程 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数) 高阶函数 filter/map/reduce filter中的回调函数有一个要求: 必须返 ...
- [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...
本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的函数 ...
- java中函数是什么_[一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...
本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的函数 看 ...
- python函数的作用降低编程复杂度_Python函数式编程
lambda 本文将介绍Python中函数式编程的特性.在对函数式编程的概念有了了解后,本文会介绍iterators和generators等语言特性,还有itertools和functools等相关的 ...
- spark编程基础--2.4函数式编程基础
foreach遍历操作 映射操作map,flatmap 过滤操作filter 规约操作 reduce,fold方法 拆分操作partition,groupedBy,grouped,sliding Sc ...
- fp函数式编程_全面了解函数式编程(FP)
fp函数式编程 This is the other major programming paradigm. If you are interested in Objected oriented pro ...
- 函数式编程|python的函数式编程
面向过程,面向对象 面向过程: 分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了 面向对象: 把问题中的事务分解成各个对象,建立对象的目的不是为了完成一 ...
最新文章
- Javascript获取select的选中值和选中文本
- 使用xmanager连接centos5.5
- pycharm 使用教程
- spring依赖注入_Spring的依赖注入陷阱
- TensorFlow报错:'dict' object has no attribute 'SerializeToString'
- simulink 解析udp数据_DNS 支持 TCP 和 UDP 双协议,但为何偏偏只钟情 UDP?
- linux舵机控制程序,Linux PWM设备驱动及舵机控制
- Unix操作系统发展历史
- chd6.0.1 kerberos安装碰到问题:
- 从基础接口工具postman开始夯实软件测试基础(一)
- Sony DRP-RP1装微信读书
- 体验AI拜年新姿势,爱奇艺技术团队这波操作真秀!
- N的阶乘:输入一个正整数N,输出N的阶乘
- 盘点几款还不错的企业网盘产品
- 微信小程序,输入时键盘弹起,聊天输入框自动弹起,内容不顶起
- 中国主要知名的旅游与酒店调查研究咨询公司
- Mac Docker入门安装使用
- 在英特尔硬件上部署深度学习模型的无代码方法 OpenVINO 深度学习工作台的三部分系列文章 - CPU AI 第一部
- 博客分享:优秀有趣的博客
- EtherCAT 从站作参考时钟
热门文章
- tornado和subprocess实现程序的非堵塞异步处理
- Apache+php 在windows下的配置
- Matlab for Mac 中文路径乱码解决
- XCode SDK接入时提示: UIApplicationInvalidInterfaceOrientation
- PHP不仅仅是PHP
- [河南省ACM省赛-第三届] AMAZING AUCTION (nyoj 251)
- 无法连接到WMI提供程序。你没有权限或者该服务器无访问
- cisco学习笔记(2)
- qq邮箱html模板_用了这么多简历模板,发现只有QQ邮箱自带的模板最好用
- python如何识别中文_python如何识别图片中的文字