编程思想-链式编程
编程思想-链式编程
链式编程(链式调用)的主要表现是支持点语法结构的代码,代表库可以参照 Masonry 或 SnapKit,Masonry 示例代码如下:maker.top.left.right.equalTo(@10)
这种编程思想在使用过程中的特点是:
1. 使用 block 作为方法的返回值;
2. 执行 block 后返回实例本身。
接下来我们通过对类中两个方法的调用,一步步研究链式调用的实现。
1.普通调用
以输出“hello world!”
为例,我们在Test
类中设置两个方法:
- (void) sayHello {
NSLog(@"hello ");
}
- (void) sayWorld {
NSLog(@"world!");
}
先声明一个实例对象test
,正常调用方法为:
[test sayHello];
[test sayWorld];
这里我们也可以使用点语法test.sayHello
,但是会触发警告:
⚠️ Property access result unused - getters should not be used for side effects
2.连续调用
我们希望在一行代码里调用多个方法,最常见的例子为[[class alloc] init]
,它实际上就是先后调用了alloc
和init
两个方法。实现的方式很简单,在上面的方法中加入返回值为 self
即可:
- (instancetype) sayHello2{
NSLog(@"HELLO ");
return self;
}
- (instancetype) sayWorld2{
NSLog(@"WORLD!");
return self;
}
调用方法可以写为test = test.sayHello2.sayWorld2
或者[[test sayHello2] sayWorld2]
,看起来很像实现了链式调用,而且但并不是我们想要的效果。
3.消除左边的赋值对象
首先考虑消灭左边的赋值对象,我们将sayWorld
方法改写为 block
的形式:
- (void(^)(void)) sayWorld3{
void(^block)(void) = ^{
NSLog(@"WORLD!");
};
return block;
}
这样我们的调用方法就可以写成test.sayHello2.sayWorld3()
,看起来更像了,而且稍微修改一下block
,我们就可以在sayWorld3
中加入参数:
- (void(^)(NSString *)) sayWorld4{
void(^block)(NSString *) = ^(NSString *word){
NSLog(@"%@", word);
};
return block;
}
调用方法为test.sayHello2.sayWorld3(@“World!”)
。
4.连续传参
最后返回 block
值可以消除左边的赋值对象,但是也只能处理最后一个方法,如果我们想在sayHello
中也加入参数处理,并且统一方法的写法,那就需要进一步的改进。
方法的返回值应该是实例本身,基于这一点出发,我们可以将方法改写为:
- (Test *(^)(NSString *)) sayHello5{
Test *(^block)(NSString *) = ^(NSString *word){
NSLog(@"%@", word);
return self;
};
return block;
}
- (Test *(^)(NSString *)) sayWorld5{
Test *(^block)(NSString *) = ^(NSString *word){
NSLog(@"%@", word);
return self;
};
return block;
}
调用方法为test.sayHello5(@"Hello ").sayWorld5(@"World!")
,至此end。
(显然还是没有实现类似 Masonry 高大上的操作,但是基本原理是一致的)
上一篇: c++this指针演示链式编程思想
下一篇: jquery操作json对象