OC中的链式编程

2021-10-28  本文已影响0人  晨曦中的花豹

今天看到项目里边有一段代码

[BAFRequest request].setBaseURL(host).setPath(path).setRequestSerializerType(RequestHTTP).setRequestType(BAFRequestTypeAPI).setMethod(MethodType).setParams(finalParams)

- (BAFRequest *(^)(NSString *baseURL))setBaseURL;

第一眼看上去感觉有点蒙,返回的是一个block,为什么可以直接去请求下一个方法呢?
其实细心地朋友已经发现了,Masonry的布局使用的就是这种编程方式,执行完一个方法后回把当前的对象返回,然后继续执行下一个方法.
其实静下心来仔细想一下,这里就非常巧妙地使用了block:
比如我们在.h中写了一个方法

- (void)set_name;

这个方法是可以通过.语法执行的


截屏2021-10-28 下午3.48.51.png

这个实际上就像是个getter,是获取值的过程,比如我们设置了一个name属性,我们可以通过.name获取到name的值.

这里我们明白了一个方法,直接通过.语法调用是获取值得过程,那接下来如果我们的返回值是个block,那个获取到的就是一个block喽

-(Person *(^)(NSString *name))set_name;

-(Person *(^)(NSString *name))set_name {
    return ^Person*(NSString *name) {
        return [[Person alloc] init];
    };
}
截屏2021-10-28 下午4.00.40.png

其实到这里应该差不多明白了,

如果这个block有返回值,我们获取到block,去执行block,是不是就可以得到这个block的返回值呢.

WeChatdafcd2a352969852ab439dcc3a3bfc07.png

到这里基本的链式编程的步骤就完成了,然后具体这个block做什么就看你自己的需要了,这里我的是简单的存储,然后把self返回

- (Person *(^)(NSString *name))setName {
    return ^Person*(NSString *name) {
        self.s_name = name;
        return self;
    };
}
- (Person *(^)(int age))setAge {
    return ^Person*(int age) {
        self.s_age = age;
        return self;
    };
}

然后就可以开开心心的链起来了

person.setName(@"小明").setAge(12);
NSLog(@"姓名: %@, 年龄: %d ,set_name: %@",person.s_name,person.s_age,person.set_name);


2021-10-28 16:17:50.192916+0800 test_oc[26267:2412081] 姓名: 小明, 年龄: 12 ,set_name: <__NSGlobalBlock__: 0x104dc00a8>

这个理解起来可能不是很好理解,是因为我们平时使用block大部分都是我们自己写block,模块内部去调用,正好跟这个思想是反过来的,所以上来第一眼看到有点蒙是很正常的,间的次数多了就会舒服了

上一篇 下一篇

猜你喜欢

热点阅读