阅读 110

Objective-C 实现链式调用

链式调用也是所谓的链式编程,是在Masonry中写法看起来十分直观,调用起来也很简单。在特定的应用环境下利用block实现链式编程,确实会大大的使代码直观易读。

[_contentView addSubview:_imgView];    [_imgView mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.equalTo(@(20)); make.top.equalTo(@(20)); make.bottom.equalTo(@(-20)); make.height.equalTo(@(CellHeight - 40)); make.width.equalTo(self.imgView.frame.height); }]; 复制代码

1. 方法的通常调用过程

// Animal.h 中定义 - (void)eat; - (void)sleep; // Animal.m 中实现 - (void)eat {     NSLog(@"%s", __FUNCTION__); } - (void)sleep {     NSLog(@"%s", __FUNCTION__); } // 通常调用过程 Animal *animal = [[Person alloc] init]; [animal sleep]; [animal eat]; 复制代码

2. 普通的链式调用

普通的链式调用就是我们常见的,多个[ ]方法调用嵌套在一起,达到链式调用的效果,还是比较好理解,也比较常用。

// Animal.h 中定义 - (Animal *)eat; - (Animal *)sleep; // Animal.m 中实现 - (Animal *)eat {     NSLog(@"%s", __FUNCTION__);     return self; } - (Animal *)sleep {     NSLog(@"%s", __FUNCTION__);     return self; } // 链式调用 [[animal eat] sleep]; //[[animal sleep] eat]; 复制代码

3. 用block实现链式调用

如下定义相当于直接使用block变量的get方法:

// Animal.h 中定义 - (void (^)())eat; - (void (^)())sleep; // Animal.m 中实现 - (void (^)())eat {     void (^eatBlock)() = ^ {         NSLog(@"%s", __FUNCTION__);     };     return eatBlock; } - (void (^)())sleep {     return ^ {         NSLog(@"%s", __FUNCTION__);     }; } // 调用 animal.eat(); animal.sleep(); 复制代码

则,block的链式调用

// Animal.h  中定义 - (Animal * (^)(NSString *foodName))eat; - (Animal * (^)(NSInteger hour))sleep; // Animal.m 中实现 - (Animal *(^)(NSString *))eat {     Animal * (^eatBlock)() = ^(NSString *foodName) {         NSLog(@"吃: %@", foodName);         return self;     };     return eatBlock; } - (Animal *(^)(NSInteger))sleep {     return ^(NSInteger hour) {         NSLog(@"睡%ld", (long)hour);         return self;     }; } // 链式调用 animal.eat(@"蛋糕").sleep(8); animal.sleep(8).eat(@"面包"); 复制代码

4. 请实现一个例子

我们创建一个view,平常初始化时会直接调用其.frame、.backgroundColor等方法设置样式。大家可以试着使用链式编程方式实现以下功能:

CustomView *custom = [CustomView makeCustomView:^(CustomView *custom) { custom.viewFrame(CGRectMake(50, 50, 200, 200)).viewColor([UIColor cyanColor]); }]; [self.view addSubview:custom];


作者:QiShare
链接:https://juejin.cn/post/7010958824933130253


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐