今天看到项目里边有一段代码
[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;
这个方法是可以通过.语法执行的

这个实际上就像是个getter,是获取值的过程,比如我们设置了一个name属性,我们可以通过.name获取到name的值.
这里我们明白了一个方法,直接通过.语法调用是获取值得过程,那接下来如果我们的返回值是个block,那个获取到的就是一个block喽
-(Person *(^)(NSString *name))set_name;
-(Person *(^)(NSString *name))set_name {
return ^Person*(NSString *name) {
return [[Person alloc] init];
};
}

其实到这里应该差不多明白了,
如果这个block有返回值,我们获取到block,去执行block,是不是就可以得到这个block的返回值呢.

到这里基本的链式编程的步骤就完成了,然后具体这个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>
网友评论