第一次来「掘金」发文章~

「函数式编程」:每个函数都有返回,函数作为第一类对象 「链式编程」:函数返回的对象继续进行函数,组成一串长链(函数式编程的体现?)

  • 拿 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 关于「链式编程」与「函数式编程」简单实践相关推荐

  1. WebFlux响应式编程基础之 2 函数式编程 工具jclasslib bytecode viewer

    函数式编程:告诉他的功能是什么,而不是告诉他怎么做 命令式编程:怎么去做 函数式编程:不需要关注细节,利用系统已经有的API 使用jdk8自带函数接口的好处 函数接口减少接口定义 函数式接口链式操作 ...

  2. SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理

    SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理 本文连接 简介 SIGIA_4P 网址 a. 课程OKR Objectives and ...

  3. 高阶函数||编程范式: 命令式编程/声明式编程 || 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数)

    编程范式: 命令式编程/声明式编程 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数) 高阶函数 filter/map/reduce filter中的回调函数有一个要求: 必须返 ...

  4. [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...

    本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程?   java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的函数 ...

  5. java中函数是什么_[一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...

    本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的函数 看 ...

  6. python函数的作用降低编程复杂度_Python函数式编程

    lambda 本文将介绍Python中函数式编程的特性.在对函数式编程的概念有了了解后,本文会介绍iterators和generators等语言特性,还有itertools和functools等相关的 ...

  7. spark编程基础--2.4函数式编程基础

    foreach遍历操作 映射操作map,flatmap 过滤操作filter 规约操作 reduce,fold方法 拆分操作partition,groupedBy,grouped,sliding Sc ...

  8. fp函数式编程_全面了解函数式编程(FP)

    fp函数式编程 This is the other major programming paradigm. If you are interested in Objected oriented pro ...

  9. 函数式编程|python的函数式编程

    面向过程,面向对象 面向过程: 分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了 面向对象: 把问题中的事务分解成各个对象,建立对象的目的不是为了完成一 ...

最新文章

  1. Javascript获取select的选中值和选中文本
  2. 使用xmanager连接centos5.5
  3. pycharm 使用教程
  4. spring依赖注入_Spring的依赖注入陷阱
  5. TensorFlow报错:'dict' object has no attribute 'SerializeToString'
  6. simulink 解析udp数据_DNS 支持 TCP 和 UDP 双协议,但为何偏偏只钟情 UDP?
  7. linux舵机控制程序,Linux PWM设备驱动及舵机控制
  8. Unix操作系统发展历史
  9. chd6.0.1 kerberos安装碰到问题:
  10. 从基础接口工具postman开始夯实软件测试基础(一)
  11. Sony DRP-RP1装微信读书
  12. 体验AI拜年新姿势,爱奇艺技术团队这波操作真秀!
  13. N的阶乘:输入一个正整数N,输出N的阶乘
  14. 盘点几款还不错的企业网盘产品
  15. 微信小程序,输入时键盘弹起,聊天输入框自动弹起,内容不顶起
  16. 中国主要知名的旅游与酒店调查研究咨询公司
  17. Mac Docker入门安装使用
  18. 在英特尔硬件上部署深度学习模型的无代码方法 OpenVINO 深度学习工作台的三部分系列文章 - CPU AI 第一部
  19. 博客分享:优秀有趣的博客
  20. EtherCAT 从站作参考时钟

热门文章

  1. tornado和subprocess实现程序的非堵塞异步处理
  2. Apache+php 在windows下的配置
  3. Matlab for Mac 中文路径乱码解决
  4. XCode SDK接入时提示: UIApplicationInvalidInterfaceOrientation
  5. PHP不仅仅是PHP
  6. [河南省ACM省赛-第三届] AMAZING AUCTION (nyoj 251)
  7. 无法连接到WMI提供程序。你没有权限或者该服务器无访问
  8. cisco学习笔记(2)
  9. qq邮箱html模板_用了这么多简历模板,发现只有QQ邮箱自带的模板最好用
  10. python如何识别中文_python如何识别图片中的文字