Block作为参数或返回值的理解与应用

2017-03-30  本文已影响0人  qiuYang_HANABI

这篇文章主要是为了方便大家理解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做参数和返回值的一些理解,如有错漏,欢迎指点~

上一篇 下一篇

猜你喜欢

热点阅读