美文网首页大刘的 iOS 自学笔记
OC链式编程的一个实践

OC链式编程的一个实践

作者: 大刘 | 来源:发表于2020-05-13 13:36 被阅读0次

所谓链式编程,基本都是调用一个方法的时候返回对象本身,然后可以继续调用方法。以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 <Foundation/Foundation.h>
#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写时做了一点手脚,最后调用代码如下:

- (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

相关文章

  • OC链式编程的一个实践

    所谓链式编程,基本都是调用一个方法的时候返回对象本身,然后可以继续调用方法。以OC为例: 不过OC使用中括号调用方...

  • 像swift一样书写OC代码OC链式编程实践

    链式编程特点 链式编程 = 点语法 事物 串联 同样的hello word代码 OC和swift调用函数时候最大的...

  • iOS 链式编程

    链式编程是OC中一种很好的设计模式。框架中使用链式编程,会让框架使用者感觉写的代码更加美观简洁。 链式编程的效果 ...

  • OC 链式编程

    _ config.h _ View Example 既然已经决定,就勇敢的去吧。 决定吧

  • OC:链式编程

    概念: 链式编程:将多个业务逻辑(方法)通过“.”(点号)串联起来的一种代码风格,形似链条,故称链式编程。核心思想...

  • iOS链式语法深入实践

    要点 什么是链式语法 OC中的RAC、Masonry、SnapKit等链式编程的典型,大家应该都熟悉了Masonr...

  • OC-链式编程

    原理:用block作为返回值实现的链式 优点通过点语法直接调用 缺点虽然点语法调出方法,但是()和括号内的值需要手...

  • 链式文件生成器原理分析(一)

    在OC里面实现链式编程,可以使用返回调用者自身来实现。但是类有很多,每个类也有很多方法,假如要实现链式编程,则需要...

  • OC中的链式编程

    今天看到项目里边有一段代码 第一眼看上去感觉有点蒙,返回的是一个block,为什么可以直接去请求下一个方法呢?其实...

  • oc链式赋值

    偶然发现同事写的代码里面有两个连续的赋值,甚是懵逼,查了下链式赋值要么是oc的链式编程要么是python的链式赋值...

网友评论

    本文标题:OC链式编程的一个实践

    本文链接:https://www.haomeiwen.com/subject/rqjnnhtx.html