关于iOS中链式编程
之前一直没有使用Masonry,最近因为比较闲,就尝试使用了下Masonry,但是Masonry这种和Objec-C大相庭径的写法,搞得我有点懵逼,于是今天简单学习了一下链式编程。为了巩固知识,于是有了这篇文章。不足之处希望大家不吝赐教。
在笔者的理解中,其实链式编程相对于我们常用的方法,最大的区别在于返回值,我们通常返回值类型为void 或其他类型的值,而链式编程返回的却是block,而block又返回了对象本身,而类方法也可以根据我们的需求来返回类对象或者作为初始化方法返回一个对象。而且可以多个方法之间可以任意调用,基本上可以无限调用下去,确实很像链子。莫非这就是链式编程的名字的由来嘛。。?
下面结合代码来~
创建一个Person类,直接贴代码
其中3是无返回值无参,4是有返回值无参,5是有返回值有参,最后两个 是有返回值多参。eat 和 sleep分别对应两种写法。eatAndSleep是为了验证笔者的猜想,将block作为返回值,结果证明猜想正确。
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class Person;
typedef Person*(^eatAndSleep3)(NSString *food, NSInteger hour);
@interface Person : NSObject
- (void)eat1;
- (void)sleep1;
- (Person *)eat2;
- (Person *)sleep2;
- (void(^)(void))eat3;
- (void(^)(void))sleep3;
- (Person *(^)(void))eat4;
- (Person *(^)(void))sleep4;
- (Person *(^)(NSString* name))eat5;
- (Person *(^)(NSInteger hour))sleep5;
- (Person *(^)(NSString *food, NSInteger hour))eatAndSleep1;
- (Person *(^)(NSString *food, NSInteger hour))eatAndSleep2;
- (eatAndSleep3)eatAndSleep3;
@end
NS_ASSUME_NONNULL_END
#import "Person.h"
@implementation Person
- (void)eat1 {
NSLog(@"吃东西1");
}
- (void)sleep1 {
NSLog(@"睡觉1");
}
- (Person *)eat2 {
NSLog(@"吃东西2");
return self;
}
- (Person *)sleep2 {
NSLog(@"睡觉2");
return self;
}
- (void(^)(void))eat3 {
void(^eat3block)(void) = ^() {
NSLog(@"吃东西3");
};
return eat3block;
}
- (void(^)(void))sleep3 {
return ^ {
NSLog(@"睡觉3");
};
}
- (Person *(^)(void))eat4 {
Person *(^eat4Block)(void) = ^() {
NSLog(@"吃东西4");
return self;
};
return eat4Block;
}
- (Person *(^)(void))sleep4 {
return ^ {
NSLog(@"睡觉4");
return self;
};
}
- (Person *(^)(NSString* name))eat5 {
Person *(^eat5block)(NSString *) = ^(NSString *name) {
NSLog(@"吃了%@", name);
return self;
};
return eat5block;
}
- (Person *(^)(NSInteger hour))sleep5 {
return ^(NSInteger hour) {
NSLog(@"睡了%ld小时", (long)hour);
return self;
};
}
- (Person *(^)(NSString *food, NSInteger hour))eatAndSleep1 {
Person *(^eatAndSleep1Block)(NSString *, NSInteger) = ^(NSString * food, NSInteger hour) {
NSLog(@"吃了%@,睡了%ld小时",food, hour);
return self;
};
return eatAndSleep1Block;
}
- (Person *(^)(NSString *food, NSInteger hour))eatAndSleep2 {
return ^(NSString *food, NSInteger hour) {
NSLog(@"睡了%ld小时,吃了%@", hour,food);
return self;
};
}
- (eatAndSleep3)eatAndSleep3 {
return ^(NSString *food, NSInteger hour) {
NSLog(@"这次吃了%@,睡了%ld小时", food, hour);
return self;
};
}
@end
继续贴上调用的代码
Person *person = [Person new];
[person eat1];
[person sleep1];
NSLog(@"\n");
[[person eat2] sleep2];
NSLog(@"\n");
person.eat3();
person.sleep3();
NSLog(@"\n");
person.eat4().sleep4();
NSLog(@"\n");
person.sleep4().eat4();
NSLog(@"\n");
person.sleep5(3).eat5(@"大闸蟹");
NSLog(@"\n");
person.eatAndSleep1(@"河豚",10).eatAndSleep2(@"一只牛", 20);
NSLog(@"\n");
person.eatAndSleep3(@"方便面",1);
然后运行结果
以上就是关于链式编程的校验demo
为了测试学习成果,自己又对UIView常用的一些方法,采用链式编程的方式,写了一个category。各位也可以自己尝试一下。
贴上.h各位参考下:
+ (UIView *(^)(CGFloat x, CGFloat y, CGFloat width, CGFloat height))zhh_viewWithFrame;
- (UIView *(^)(UIColor *color))zhh_setBackgroundColor;
- (UIView *(^)(CGFloat radius))zhh_setCornerRadius;
- (UIView *(^)(CGFloat alpha))zhh_setAlpha;
- (UIView *(^)(UIView *superView))zhh_setSuperView;
- (UIView *(^)(tapAction tapBlock))zhh_setTapAction;
下面是此次学习链式编程的完整demo。 链式编程学习Demo GitHub下载地址
手动码字不易。