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

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

前言

先来复习下你开发过程接触的场景思想

  1. 面向过程:处理事情以过程为核心,一步一步的实现。
  2. 面向对象:万物皆对象

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

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

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

image.png

代表:masonry框架

 p.run() <=> [p run]();//执行方法的同时之后,立即执行方法返回的block
  1. 响应式编程思想:不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。

代表: a. KVO 是 Objective-C 对观察者模式(Observer Pattern)的实现,也是 Cocoa Binding 的基础。当被观察对象的某个属性发生更改时,观察者对象会获得通知。

b. Reactive Cocoa框架

  1. 函数式编程思想:是把操作尽量写成一系列嵌套的函数或者方法调用。

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

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[]) {
    @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;
}

代码的实现

#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;
    };
}

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

image.png

用法例子

image.png

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

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

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

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

用法

- (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;
}

II、函数式编程总结

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

see also

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

1、封装富文本API,采用block实现链式编程

2、 超链接属性

3、HTML字符串与富文本互转

4、创建带有图片的富文本

目录
相关文章
|
1月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
110 1
|
8天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
27 9
|
8天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
6天前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
9天前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
14天前
|
设计模式 前端开发 Swift
探索iOS开发:从初级到高级的旅程
【10月更文挑战第31天】在这篇文章中,我们将一起踏上iOS开发的旅程。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。我们将从基础开始,逐步深入到更高级的技术和概念。让我们一起探索iOS开发的世界吧!
|
17天前
|
设计模式 前端开发 Swift
探索iOS开发:从初级到高级的旅程
【10月更文挑战第28天】在这篇技术性文章中,我们将一起踏上一段探索iOS开发的旅程。无论你是刚入门的新手,还是希望提升技能的开发者,这篇文章都将为你提供宝贵的指导和灵感。我们将从基础概念开始,逐步深入到高级主题,如设计模式、性能优化等。通过阅读这篇文章,你将获得一个清晰的学习路径,帮助你在iOS开发领域不断成长。
49 2
|
18天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
33 1
|
22天前
|
安全 API Swift
探索iOS开发中的Swift语言之美
【10月更文挑战第23天】在数字时代的浪潮中,iOS开发如同一艘航船,而Swift语言则是推动这艘船前进的风帆。本文将带你领略Swift的独特魅力,从语法到设计哲学,再到实际应用案例,我们将一步步深入这个现代编程语言的世界。你将发现,Swift不仅仅是一种编程语言,它是苹果生态系统中的一个创新工具,它让iOS开发变得更加高效、安全和有趣。让我们一起启航,探索Swift的奥秘,感受编程的乐趣。
|
27天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
47 5