OC链式编程的一个实践
所谓链式编程,基本都是调用一个方法的时候返回对象本身,然后可以继续调用方法。以OC为例:
@interface Person : NSObject- (Person *)eat:(NSString *)food;
- (Person *)drink:(NSString *)water;
- (Person *)sleep:(NSInteger)hour;
@property (nonatomic, weak, readonly) Person *(^makeFriend)(NSString *name);
@property (nonatomic, weak, readonly) Person *(^learn)(NSString *name);
@end
#import "Person.h"@implementation Person- (Person *)eat:(NSString *)food {
NSLog(@"eat %@", food);
return self;
}- (Person *)drink:(NSString *)water {
NSLog(@"drink: %@", water);
return self;
}- (Person *)sleep:(NSInteger)hour {
NSLog(@"sleep: %ld hours", (long)hour);
return self;
}- (Person * _Nullable (^)(NSString * _Nonnull))makeFriend {
return ^Person *(NSString *name) {
NSLog(@"make friend: %@", name);
return self;
};
}- (Person * _Nullable (^)(NSString * _Nonnull))learn {
return ^Person *(NSString *name) {
NSLog(@"learn: %@", name);
return self;
};
}@end
#import
#import "Person.h"int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = Person.new;
[[[p eat:@"兰州拉面"] drink:@"水"] sleep:3].learn(@"数学").makeFriend(@"路飞");
}
return 0;
}
不过OC使用中括号调用方式的链式编程写起来不如点语法舒服。从底层支持链式编程的语言当数用于Fluuter的Dart语言,直接
obj..method1()..method2()..
,这是从语言底层直接支持。 写这种代码,Swift要比OC有优势。我们知道这种写法能做些什么呢?Masonry就是使用这种思想来做的。在实际的工作中,我的一个工作经历是,项目中使用的是全是OC,在对视图进行赋属性时往往是:
UIView *view = UIView.new;
view.backgroudColor = ...
view.frame = ..
...
【OC链式编程的一个实践】当时我想是否可以用链式思想简化一些写法,哪怕只是语法糖,但仍然是一件有意思的事情,于是花了半天时间写了出来,但是由于OC对泛型的支持并不彻底,在用OC写时做了一点手脚,最后调用代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:UIButton.new
.dl_frame(CGRectMake(0, 0, 100, 100))
.dl_backgroundColor(UIColor.redColor)
.dl_titleColorForState(UIColor.whiteColor, UIControlStateNormal)
.dl_titleForState(@"Click me", UIControlStateNormal)
.dl_center(self.view.center)
.dl_cornerRadius(8)
.dl_clipsToBounds(YES)
.dl_addTargetAction(self, @selector(buttonClick:), UIControlEventTouchUpInside)];
}
我这里用自己的名字“大刘 dl_”作为前缀和系统方法区分。这里 是源码代实现。
https://github.com/ACommonChinese/OCLinkSetProperty
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量