前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS小技能:链式编程在iOS开发中的应用

iOS小技能:链式编程在iOS开发中的应用

作者头像
公众号iOS逆向
发布2022-08-22 12:36:23
7870
发布2022-08-22 12:36:23
举报
文章被收录于专栏:iOS逆向与安全iOS逆向与安全

I 预备知识

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

1.1 面向过程

处理事情以过程为核心,一步一步的实现。

1.2 面向对象

万物皆对象

面向对象对比面向过程的优胜之处在于,名词化的概念比动词化的描述,更便于人类理解。 这也是相比函数式编程的主要优点,许多函数是难以命名的,但对象却很容易。

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

1.3 函数式编程

把操作尽量写成一系列嵌套的函数或者方法调用。

函数式编程特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参数(需要操作的值)block返回值(操作结果) 代表:ReactiveCocoa

1.4 链式编程

将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好a(1).b(2).c(3)。

链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)

代表:masonry框架

代码语言:javascript
复制
 p.run() <=> [p run]();//执行方法的同时之后,立即执行方法返回的block

1.5 响应式编程

不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。

代表:

  1. KVO 是 Objective-C 对观察者模式(Observer Pattern)的实现,也是 Cocoa Binding 的基础。当被观察对象的某个属性发生更改时,观察者对象会获得通知。
  2. Reactive Cocoa框架
  3. vuejs: https://staging-cn.vuejs.org/guide/introduction.html

II 链式编程的例子

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

  1. 声明属性,属性的类型是block,block必须有返回值(本身对象),block参数(需要操作的值)
  2. `声明方法: 就是执行(getter)方法之后,得到一个block,block必须有返回值(本身对象),block参数(需要操作的值)

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

两种实现方式本质都是一样的:

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

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

缺点: Xcode提示不太友好(不推荐)

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

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

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

代码的实现

代码语言:javascript
复制
#import "People.h"

@implementation People

- (People *(^)())run{
    return ^{
        NSLog(@"run");
        return self;
    };// 返回一个block
}


- (People *(^)())study{
    return ^{
        NSLog(@"study");
        return self;
    };// 返回一个block
}


- (People *(^)(NSString *))name{
    return ^(NSString *name){
        NSLog(@"%@",name);
        return self;
    };
}

2.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. 用法例子
代码语言:javascript
复制
    NSMutableAttributedString *xx  = [[NSMutableAttributedString alloc]init];
    
    
    xx.kn_addString(@"封装富文本API").kn_fontColor(UIColor.redColor).kn_addString(@"采用block实现链式编程").kn_fontColor(UIColor.blueColor).kn_addString(@"!");

https://github.com/zhangkn/ChainAttributedString

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

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

代码语言:javascript
复制
- (MASConstraint * (^)(id))equalTo { return ^id(id attribute) { return self.equalToWithRelation(attribute, NSLayoutRelationEqual); }; }

用法

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iOS逆向 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • I 预备知识
    • 1.1 面向过程
      • 1.2 面向对象
        • 1.3 函数式编程
          • 1.4 链式编程
            • 1.5 响应式编程
            • II 链式编程的例子
              • 2.1 实现链式编程的两种形式
                • 2.2 通过声明方法形式实现链式编程
                  • 2.3 通过声明属性形式实现链式编程
                  • see also
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档