这篇文章主要是为了方便大家理解Block作为参数或返回值的情况,是我在学习链式编程时总结的,希望能帮到大家~
Block作为返回值
typedef NSString *(^NameBlock)(NSString *inputValue);
@property(nonatomic, assign)NSInteger result;
@property(nonatomic, copy)NameBlock nameBlock;
在上面的代码中,NSInteger可以理解为调用result时的返回值类型,同样,调用nameBLock时返回值的数据类型也是NameBlock类型。
调用result属性时其实是调用result的set/get方法,相替代的,我们也可以不去把result定义成一个属性,而是定义成一个返回值为NSInter的result方法,这样也能实现它作为属性时的功能:
//声明(需要定义一个静态变量来存值static NSString *resultStr;)
- (NSString *)result;
- (NSString *)result:(NSString *)string;
//实现
- (NSString *)result{
return resultStr;
}
- (NSString *)result:(NSString *)string{
resultStr = string;
return resultStr;
}
//调用
[self result:@"233"];
NSLog(@"%@", self.result);
同理BLock也可以这么做(以get方法为例):
- (NSString *(^)(NSString *))nameBlock; //nameBlock的get方法声明
- (NSString *(^)(NSString *))nameBlock{ //实现
return ^NSString *(NSString *inputValue){ //返回值为Block块
return [inputValue stringByAppendingString:@"233"];//Block块内部的返回值,这个才是整个方法真正的返回值
};
}
//调用
NSLog(@"%@", self.nameBlock(@"123"));
刚才的例子实现了nameBLock这个BLock块的get方法,其实也就是Block作为返回值的应用,只不过这样更好理解
Block作为参数
Block块作为参数时(Block块也有返回值):
//声明
- (void)inputTheBlock:(NSString *(^)(NSString *inputStr))nameBlock;
//实现 - block内部
- (void)inputTheBlock:(NSString *(^)(NSString *))nameBlock{
NSString *inputStr = @"123";//想要传到外部的信息
inputStr = nameBlock(inputStr);//将inputStr交给外部处理,然后将处理结果返回这里
NSLog(@"%@", inputStr);//将处理过的inputStr输出
}
//调用 - block外部
[self inputTheBlock:^NSString *(NSString *inputStr) {
NSLog(@"接到的block的参数:%@", inputStr)
//对inputStr进行处理
inputStr = [inputStr stringByAppendingString:@"456"];//给inputStr添加字段
return inputStr;//将处理好的inputStr返回
}];
以上就是我对Block做参数和返回值的一些理解,如有错漏,欢迎指点~
网友评论