Objective-C 链式编程思想

链式编程思想

链式编程是什么

链式编程就是将调用多个方法用点语法连接起来,让代码更加简洁和可读性更高
刚开始接触链式编程是Masonry,用起来真的非常爽

1
make.left.right.top.equalTo(self.view);

这样一句语句就调用了4个方法
.left调用了left属性的get方法
.right, .top调用了right和top方法
.equalTo()调用了equalTo方法

这种写法极大简化了写约束的方式

原理

原理就是调用的属性的类型或者方法的返回类型为原调用属性的类型
例如说UILabel调用了某个方法或者属性,得到的类型还是UILabel,那么还可以继续调用UILabel的属性或者方法

如何实现

看了Masonry,我发现有两种实现方式

1.用点语法调用方法

这个其实我之前没发现,写习惯了用方括号调用方法
例如创建一个label 可以这样写UILabel *label = [[UILabel alloc] init
其实也可以这样写UILabel *label = UILabel.alloc.init
不过后种方法几乎没人用,苹果应该也不推荐这种写法,因为有时候这样写是没有代码提示的
但是有一个缺点就是不能调用有参数的方法,所以我们只能写没有参数的方法

创建一个UIButton的分类
写两个方法

12
- (UIButton *)setTextHello;- (UIButton *)setTextColorRed;

并且实现

1234567891011
- (UIButton *)setTextColorRed{    [self setTitleColor:[UIColor redColor] forState:UIControlStateNormal];    return self;}

- (UIButton *)setImage{    [self setImage:[UIImage imageNamed:@"Stan1"] forState:UIControlStateNormal];    return self;}

然后我们创建一个按钮的时候就可以这样写

12345
//创建一个按钮UIButton *button = [UIButton buttonWithType:UIButtonTypeInfoLight];button.frame = CGRectMake(100, 100, 100, 100);button.setTextHello.setTextColorRed;[self.view addSubview:button];

效果如图

但是会报一个警告,因为调用的是属性,但是这个属性没有被用到
解决方法是在调用属性前面加(void),这样就可以了

2.用属性调用

新创建一个UILabel的分类
如果要传入参数的话,就返回一个UILabel的block,可以在block里面实现你想要实现的东西

123
@property(nonatomic,copy) UILabel* (^kText)(NSString *text);@property(nonatomic,copy) UILabel* (^kFont)(NSUInteger fontSize);@property(nonatomic,copy) UILabel* (^kTextColor)(UIColor *color);

加k是为了易于区分,可以不加的
因为这是在分类里面的属性,不会生成setter和getter方法,所以都要自己写
实现如下

123456789101112131415161718192021222324252627
- (UILabel *(^)(NSUInteger))kFont{    return ^(NSUInteger font){        [self setFont:[UIFont systemFontOfSize:font]];        return self;    };}

- (UILabel *(^)(NSString *))kText{    return ^(NSString *text){        [self setText:text];        return self;    };}

- (UILabel *(^)(UIColor *))kTextColor{    return ^(UIColor *color){        [self setTextColor:color];        return self;    };}

- (void)setKFont:(UILabel *(^)(NSUInteger))kFont{}- (void)setKText:(UILabel *(^)(NSString *))kText{}- (void)setKTextColor:(UILabel *(^)(UIColor *))kTextColor{}

不会用到setter方法,也不能用,所以setter方法设为空
然后就能愉快的链式编程了

然后我再想,假如没有参数呢,刚开始是想block没有参数

123
@property(nonatomic,copy) UILabel* (^aText)();@property(nonatomic,copy) UILabel* (^aFont)();@property(nonatomic,copy) UILabel* (^aTextColor)();

实现

123456789101112131415161718192021222324252627
- (UILabel *(^)())aFont{    return ^(){        [self setFont:[UIFont systemFontOfSize:16.0f]];        return self;    };}

- (UILabel *(^)())aTextColor{    return ^(){        [self setTextColor:[UIColor cyanColor]];        return self;    };}

- (UILabel *(^)())aText{    return ^(){        [self setText:@"这还是一个label"];        return self;    };}

- (void)setAFont:(UILabel *(^)())aFont{}- (void)setAText:(UILabel *(^)())aText{}- (void)setATextColor:(UILabel *(^)())aTextColor{}

后来发现调用的时候还是要这样

尝试了一下,最后一个调用能去掉括号,报警告,能运行,但是没效果

所以我想为什么不直接调用属性

123
@property(nonatomic,strong) UILabel *bText;@property(nonatomic,strong) UILabel *bFont;@property(nonatomic,strong) UILabel *bTextColor;

getter && setter

123456789101112131415161718192021
- (UILabel *)bText{    [self setText:@"labellabel"];    return self;}

- (UILabel *)bTextColor{    [self setTextColor:[UIColor purpleColor]];    return self;}

- (UILabel *)bFont{    [self setFont:[UIFont systemFontOfSize:13.0f]];    return self;}

- (void)setBFont:(UILabel *)bFont{}- (void)setBText:(UILabel *)bText{}- (void)setBTextColor:(UILabel *)bTextColor{}

调用

123
UILabel *label3 = [[UILabel alloc] initWithFrame:CGRectMake(100, 400, 200, 100)];(void)label3.bTextColor.bText.bFont;[self.view addSubview:label3];

如果调用不加(void)还是会报警告
如果想像Masonry那样的链式编程可以这样写

123
UILabel *label3 = [[UILabel alloc] initWithFrame:CGRectMake(100, 400, 200, 100)];label3.bTextColor.bText.kFont(30);[self.view addSubview:label3];

这样就不会报警告,整洁清晰

还发表在 我的个人博客

时间: 2024-07-31 04:48:46

Objective-C 链式编程思想的相关文章

链式编程思想

接下来的部分摘自:最快让你上手之ReactiveCocoa基础篇 先简单介绍下目前咱们已知的编程思想. 1 面向过程:处理事情以过程为核心,一步一步的实现. 2 面向对象:万物皆对象 3 链式编程思想:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好.a(1).b(2).c(3) 链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值) 代表:Masonry框架. 4 响应式编程思想:不需要考虑调用顺序,只需要知道考虑

ASP.NET MVC学前篇之扩展方法、链式编程

前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的是外围的知识,有的是包含在框架内的. MVC学前篇字样?有噱头的成分也有真实的成分,所以工欲善其事,必先利其器.器是什么?基础嘛,虽然说MVC框架中涉及到的知识很多很多也不是我一篇两篇能说完的,我能做的就是知道多少就跟大家分享多少,当然了随着时间的推移会完善这个系列. 1扩展方法 扩展方法是C# 3.0特性里的知识,它用在最多的地方是在Linq中,

ReactiveCocoa链式编程初探

在使用 masonry 框架实现自动布局时,在程序里为一个布局穿插着6行左右这样的代码 [View mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(anotherView); make.left.equalTo(anotherView); make.width.mas_equalTo(@60); make.height.mas_equalTo(@60); }]; 一直觉得不够漂亮,希望有个一行代码设置约束的框架

链式编程:泛型实现的扩展方法类

序言 本文分享一个用链式编程思想和泛型实现的扩展方法类,用于减少代码量,并提供更为清晰的业务逻辑代码表达. 概念 链式编程:将多个业务逻辑(方法)通过“.”(点号)串联起来的一种代码风格,形似链条,故称链式编程.核心思想在于每个方法均返回自身实例. 泛型:可以理解为是一个类的“篮子“”,只要符合约束的类均可以放置在该“篮子”里面. 扩展方法:向现有类添加方法. 根据泛型和扩展方法的特点,泛型+扩展方法实现了向所有符合约束的“类”添加方法,可减少重复代码量. (.Net语言提供了这么优雅的特性,刚

数往知来 JQuery_选择器_隐式迭代_链式编程 <二十>

一.通过js实现页面加载完毕执行代码的方式与jquery的区别 1.通过jquery的方式可以 让多个方法被执行,而通过window.onload的方式只能执行最后一个, 因为最后一次注册的方法会把前面的方法覆盖掉 1. window.onload需要等待页面的所有元素资源比如说img里的图片一些连接等等都下载完毕后才会触发: 2. 而jquery只要页面的标签元素都下载完毕就会触发了 二.$.map(数组,function(ele,index){})函数对数组进行遍历,遍历之后会返回一个新的数

(一一八)利用block实现链式编程

有些时候需要不断地调用方法,如果使用传统方案,需要拿到对象多次调用,例如有一个Ball对象,实现了up.down.left.right四个方法,分别控制球的运动方向,如果要实现球向右再向下,需要这么写: [ball right]; [ball down]; 如果能够按照下面这样写,会更加方便. [[ball right] down]; 要实现这样的功能十分简单,只要每个方法都返回self即可,但是如果调用次数多,会有很多个中括号.如果能改造成后面这样,会更好. ball.right().down

JavaScript系列:模块化与链式编程

模块化:闭包和和函数作用域(JS没有块级作用域ES6之前)构造模块 1 var man=function(){ 2 var age=12; 3 return { 4 getYear:function(){ 5 return age; 6 }, 7 setYear:function(n){ 8 age=n; 9 } 10 } 11 } 12 13 var peter=man(); 14 document.write(peter.getYear()); //12 15 peter.setYear(2

jQuery插件编写及链式编程模型

jQuery插件编写及链式编程模型小结 JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我们就来看看如何把我们常用的功能做出JQuery插件,然后像使用jQuery那样来操作DOM.  一.jQuery插件开发快速上手 1.jQuery插件模板 关于jQuery插件的编写,我们可以通过为jQuery.fn增加一个新的函数来编写jQuery插件.属性的名字就是你的插件的名字,其模板如下:

iOS端JSON转Model链式编程框架SuperKVC使用方法与原理

背景 在client编程中.字典转模型是一个极为常见的问题,苹果提供了KVC来实现NSDictionary到Model的注入,可是KVC仅仅能进行单层浅注入.且无法处理类型转换.key与属性名不正确应.深度注入等问题,笔者从Masonry得到启示,开发了一个通过链式配置注入器实现深度注入.类型转换.key-属性名映射等功能的轻量级注入框架SuperKVC.眼下已经开源到GitHub,点击这里前往.欢迎Star和Fork.欢迎和我一起完好这个框架! 本文将从应用和原理两个角度介绍SuperKVC