Objective-c 函数式编程和点语法
来源:互联网 发布:韩语配音软件 编辑:程序博客网 时间:2024/04/28 18:43
函数式编程简介
背景
现在越来越多的人开发接受并进行函数式编程。目前最当红的Objective-c,Python,Ruby,Javascript等引入函数式是编程。现在最新的swift要借鉴了这个函数式编程。
定义
是一种编程范例,他将计算机运算视为书序上的函数计算,并避免使用程序状态及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。λ演算中最关键的要素就是函数被当作变量处理,能够参与运算。
函数式编程特性
封装,继承,多态是面向对象编程的三大特征。函数式编程也有自己的语言特征。数据不可变性:多有的变量只可以辅助一次,变了不可变,如果想改变变了就创建一个新的变量。函数是第一公民:函数可以像普通变量一样去使用。函数可以像变量一样被创建,修改,并当成变量一样传递,返回或是在函数中嵌套函数。
—
引用透明:指的是函数的运行不依赖于外部变量或“状态”,只依赖于输入的参数,任何时候只要参数相同,调用函数所得到的返回值总是相同的。天然适应并发编程,因为调用函数的结果具有一致性,所以根本不需要加锁,也就不存在死锁的问题。
—
—尾递归化: 因为函数调用要压栈保存现场,递归层次过深的话,压栈过多会产生性能问题。所以引入尾递归优化,每次递归时都会重用栈,提升性能。
Masnory
在iOS 开发中我看到了他的编写的特征,他和传统OC编程开发有点不太习惯,我刚开始使用这个库的时候我是感觉很容易上手,但是他一开始与OC的编程习惯很不一样,理解和学习还是用了一些时间:
make.centerY.equalTo(self.view).offset(100);//显然上面就像一句话一样 : view的Y轴中心等于self.view的Y中心偏移100 这个是链编程 上面的链式编程 显而易见 他的可读性 非常的好
链式编程
1.新建项目command+shift+N
2.创建一个Person类
并添加两个方法:
-(void)run;-(void)study;
简单实现:
-(void)run{ NSLog(@"run");}-(void)study{ NSLog(@"study");}
3.实例化并调用相关的方法
Person *person=[[Preson alloc] init];[person run];[person study];//这个是OC的代码风格
最终目标
person.runBlock().studyBlock().runBlock(); person.studyBlock().studyBlock().runBlock();
分解目标1.先实现这种方式调用
[[person run1] study1];
2.再实现最终目标
显然,如果想要实现[person run1]调用一个方法,那么run1就需要一个返回一个对象,让这个对象去调用study1。这样分析后,就简单了,就是增加一个返回值。
代码方法的声明
-(Person*)run1;-(Person*)study1;//返回Preson类 ->里面有run1和study1 返回对象是是链式编程的关键
方法的实现
- (Person*)run1 { NSLog(@"run"); return [[Personalloc] init];}- (Person*)study1{ NSLog(@"study"); return[[Personalloc]init];}
实现最终目标:
person.runBlock().studyBlock().runBlock();
在OC中,`()`block是以 () 的形式去执行的,猜想如果返回一个block的话,那么我就可以用 () 来实现runBlock()这种效果了吧!
再结合我们的分解步骤,runBlock()代表执行了一个block,如果这个block的返回值的是一个对象的话,那么调用另外一个方法;这样就可以一直链接下去吧!实现了我们想要的目标!
代码:声明
- (Person* (^)())runBlock;- (Person* (^)())studyBlock;
实现:
//block 嵌套方法可以增加代码的内聚性 - (Person* (^)())runBlock { //这个的block 有 有一个Preson类放回值(^name)(传入值) Person* (^block)() = ^() { NSLog(@"run"); return self; }; return block;} - (Person* (^)())studyBlock { Person* (^block)() = ^() { NSLog(@"study"); return self; }; return block;}
再来看一下Masonry的一个函数式编程
make.right.equalTo(self.right).insets(kPadding);
最终调用的函数:返回的就是一个返回值为MASConstraint的block
- (MASConstraint* (^)(id))equalTo { return ^id(idattribute) { return self.equalToWithRelation(attribute,NSLayoutRelationEqual); };}
- Objective-c 函数式编程和点语法
- Objective-C点语法
- objective-c 点语法
- 【Objective-C】点语法
- Objective-C 【点语法】
- Objective-C 点语法
- Objective-C点语法
- Objective-c - 点语法
- objective-c语法学习:@property属性和点语法
- 【Objective-C】06-点语法
- 【Objective-C】06-点语法
- 【Objective-C】06-点语法
- Objective-C - 点语法本质
- Objective-C中的@property,@synthesize和点语法
- Objective-C中的点语法和自定义构造方法
- Objective-C 使用点语法调用getters和setters
- Objective-c语言_点语法和@property
- Objective-C语言_点语法和@property
- Hdu ::FatMouse' Trade
- Quartz框架——实现定时任务调度
- struts2的流程和一系列相关知识
- 关于vmvare配置centos6虚拟机访问外网
- matlab 小波分析工具
- Objective-c 函数式编程和点语法
- 关于json
- Mysql can't get hostname for you address解决方案
- struts2的入门讲解和示例
- redis集群搭建详细步骤
- gson解析
- 深入理解java虚拟机 精华总结(面试)
- request.setAttribute()和request.getSession().setAttribute()解释
- RabbitMQ使用不当导致的队列堵塞问题及解决之道