锅炉信息网 > 锅炉知识 > 锅炉百科

链式编程在iOS开发中的应用

发布时间:

前言先来了解下开发过程中常常接触的几个编程思想:面向过程:处理事情以过程为核心,一步一步的实现。函数式编程思想:是把操作尽量写成

前言

先来了解下开发过程中常常接触的几个编程思想:

  1. 面向过程:处理事情以过程为核心,一步一步的实现。
  2. 函数式编程思想:是把操作尽量写成一系列嵌套的函数或者方法调用。
函数式编程特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参数(需要操作的值)block返回值(操作结果) 代表:ReactiveCocoa
  1. 面向对象:万物皆对象
面向对象对比面向过程的优胜之处在于,名词化的概念比动词化的描述,更便于人类理解。 这也是相比函数式编程的主要优点,许多函数是难以命名的,但对象却很容易。 回顾下封装、继承、多态。

封装是为了更好的重用性、可扩展性,但要综合考虑性能问题,即使新增了判断也会增加性能,只是不会量级的增加。 比如简单工厂和抽象工厂(反射机制)的封装,会增加性能的消耗。但把对象的管理变成了可配置化。

  1. 链式编程思想:将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好a(1).b(2).c(3)。
链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值) 代表:masonry框架

p.run() <=> [p run]();//执行方法的同时之后,立即执行方法返回的blockn

  1. 响应式编程思想:不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。
代表: a. KVO 是 Objective-C 对观察者模式(Observer Pattern)的实现,也是 Cocoa Binding 的基础。当被观察对象的某个属性发生更改时,观察者对象会获得通知。 b. Reactive Cocoa框架

查看原文关注公众号【iOS逆向】

I 、链式编程的例子


1.1 实现链式编程的两种形式

  1. 声明属性,属性的类型是block,block必须有返回值(本身对象),block参数(需要操作的值)
  2. 声明方法: 缺点就是 Xcode提示不太友好。不推荐
本质都是一样的,就是执行(getter)方法之后,得到一个block,block必须有返回值(本身对象),block参数(需要操作的值)

1.2 通过声明方法形式实现链式编程

缺点就是 Xcode提示不太友好。不推荐`

block 实现链式编程的例子1:(将block和method的特性 结合起来) https://github.com/zhangkn/DKUsingblockImplementChainProgramming
直接声明方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)

例子: p.run() <=> [p run]() 效果:p.run() <=> [p run]();// 执行方法的同时之后,立即执行方法返回的block。

int main(int argc, const char * argv[]) {n @autoreleasepool {n // insert code here...n //使用block实现链式编程n People *p= [[People alloc]init];n// p.run() <=> [p run]();// 执行方法的同时之后,立即执行方法返回的block。n p.run().study();n n p.run().name(@"将block和method的特性 结合起来");n n n }n return 0;n}n

代码的实现

#import "People.h"nn@implementation Peoplenn- (People *(^)())run{n return ^{n NSLog(@"run");n return self;n };// 返回一个blockn}nnn- (People *(^)())study{n return ^{n NSLog(@"study");n return self;n };// 返回一个blockn}nnn- (People *(^)(NSString *))name{n return ^(NSString *name){n NSLog(@"%@",name);n return self;n };n}nn

1.3 通过声明属性形式实现链式编程

声明属性,属性的类型是block,block必须有返回值(本身对象),block参数(需要操作的值)

声明属性: 本质就是利用他的getter方法
完整SDK源码【封装富文本API,采用block实现链式编程】(block 的妙用:结合block和方法的优点实现iOS的链式编程)
  1. 文章:https://blog.csdn.net/z929118967/article/details/107835195
  2. 从CSDN资源下载完整SDK代码:https://download.csdn.net/download/u011018979/14038715
  3. 部分API
  1. 用法例子


NSMutableAttributedString *xx = [[NSMutableAttributedString alloc]init];n n n xx.kn_addString(@"封装富文本API").kn_fontColor(UIColor.redColor).kn_addString(@"采用block实现链式编程").kn_fontColor(UIColor.blueColor).kn_addString(@"!");nn

https://github.com/zhangkn/ChainAttributedString

以Masonry 框架为例子,进行分析

调用的equalTo:方法 返回的就是一个返回值为MASConstraint的block

- (MASConstraint * (^)(id))equalTo { return ^id(id attribute) { return self.equalToWithRelation(attribute, NSLayoutRelationEqual); }; }n

用法

- (UIImageView *)imgForReason{n n if (nil == _imgForReason) {n n n n UIImageView *img2 = [[UIImageView alloc] init];n n _imgForReason = img2;n n [self addSubview:_imgForReason]; n n [img2 mas_makeConstraints:^(MASConstraintMaker *make) {n n make.left.equalTo(self.mas_left).offset(25);n n make.top.equalTo(self.imgForPassword.mas_bottom).offset(12);n n make.size.mas_equalTo(CGSizeMake(kScreenWidth-100, 76));n n n n }];n n n n }n n return _imgForReason;n n}n

II、函数式编程总结

  • 如果想再去调用别的对象方法,那么就需要返回一个对象;
  • 如果想用()去执行,那么需要返回一个block;
  • 如果想让返回的block再调用对象的方法,那么这个block就需要返回一个对象(即 返回值为一个对象的block)。

更多编程思想请到#公众号:iOS逆向交流

see also

iOS富文本&图文混排的使用指南

1、封装富文本API,采用block实现链式编程
2、 超链接属性
3、HTML字符串与富文本互转
4、创建带有图片的富文本
————————————————
版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/z929118967/article/details/114014827

开闭原则

一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。

Software entities like classes,modules and functions should be open for extension but closed for modifications. 开闭原则是应对需求变更的最基本手段。

写程序的小感悟

在开发程序的时候必须要考虑到运维的简单性。

因为越复杂的运维需求,导致越高的事故率,70% 的线上事故是和运维操作有关.

游戏程序优化的基本出发点

游戏程序的基本特点,是对延迟的苛刻要求,以及对数据准确性的不苛刻要求。

软件系统性能提高的最常用手段有两个,其一是缓存,其二是分布。

缓存就是时空转换,以时间、空间中富裕的一种去弥补紧缺的另外一种; 分布就是增加多个硬件一起解决问题,核心是如何分配以及最后结合这些工作任务。

设计模式,是利用面向对象的语言特性,去解决一系列常见问题的典型方法。

数据结构加算法等于程序,这个描述现在来看并不完整。需要被程序处理的数据,同样是一个程序的重要组成部分。数据流中的输入和输出永远是至关重要的。

精选推荐

  • 711关东煮供应商
    711关东煮供应商

    今天给大家介绍三位,奶粉,全家、罗森这些便利店里关东煮的供应商。店里卖三四块钱一串的关东煮,在网上买不到,一块钱就搞定。首先关东

  • 健康日历|高压锅容易爆炸的4个原因
    健康日历|高压锅容易爆炸的4个原因

    来源:医药养生保健报设计:李雅琴医学审核:姜峰出品人:胡丽丽

  • 高炉
    高炉

    今天这活却是个白事,等到了时辰,那家人便准备火化,本来准备送普炉,我却心中一动,便对那家人说道:“这老人走也不要省,还是送高炉吧。”

  • 高压锅和电压力锅的区别,推荐几款点压力锅
    高压锅和电压力锅的区别,推荐几款点压

    记得之前有一次去朋友家玩,他正在用高压锅煮小米粥,是的,高压锅压小米粥,大概煮了半小时,高压锅突然爆炸了,现场惨不忍睹啊,幸好厨房里没

0