今天和大家一起来学习一下Block的基本使用,有疏忽的地方,还望各位不吝赐教。
一、Block表达式和基本使用
1、表达式
// ^id(int x , int y)
/* 完整的block类型 最好抽离成代码块 系统提供的inlineBlock是缺少返回值类型的,完整的block表示如下 等号前面是block的定义,等号后面是block的值
<#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^<#返回值类型#>(<#parameters#>) {
<#statements#>
};
*/
// id(^sumBlock)(int a , int b) = ^id(int x , int y) {
// NSString *str;
// return nil;
// };
// sumBlock(2,3);
2、基本使用
- 属性和方法
Person *p = [[Person alloc] init];
// block 作为属性 在合适的时候调用方法
/** block定义作为属性 */
p.run = ^() {
NSLog(@"执行对象中的block");
};
/** block定义作为属性调用时机 */
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
self.p.run();
}
// block 作为参数 外界不调用,留给内部调用
[p eat:^{
NSLog(@"吃东西");
}];
// Person.h
/** block定义 作为属性 */
@property (nonatomic, copy) void(^run)();
/** 作为方法参数 */
- (void)eat:(void(^)())block;
// Person.m
- (void)eat:(void(^)())block{
NSLog(@"在person里面调用block");
// 这里调用相当于执行下面一段代码
/*
[p eat:^{
NSLog(@"吃东西");
}];
*/
block();
}
- 返回值
Person *p = [[Person alloc] init];
// block 作为返回值
// 希望p.run 来调用
// 1、void(^block)() = p.run;
// 2、block();
// 3、p.run(11);
NSLog(@"%zd",p.run(11).run(13).run(14));
// Person.h
- (Person *(^)(int x))run;
// Person.m getter
- (Person *(^)(int x))run{
// NSLog(@"跑起来");
// self 是方法调用者
return ^Person *(int x) {
_result += x;
return self;
};
}
二、链式调用
1、以加法运算为例
/*
* ViewController.m
*/
#import "ViewController.h"
#import "NSObject+Sum.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
int result = [self makeSum:^(SumManager *mgr) {
mgr.add(1).add(2);
}];
NSLog(@"%zd",result);
}
@end
/*
* SumManager.h
*/
#import <Foundation/Foundation.h>
@interface SumManager : NSObject
/** result */
@property (nonatomic, assign) int result;
- (SumManager * (^)(int value))add;
@end
/*
* SumManager.m
*/
#import "SumManager.h"
@implementation SumManager
- (SumManager *(^)(int value))add{
return ^SumManager *(int value){
_result += value;
return self;
};
}
@end
/* 分类实现
* SumManager.h
*/
#import <Foundation/Foundation.h>
#import "NSObject+Sum.h"
@interface NSObject (Sum)
- (int)makeSum:(void(^)(SumManager *))block;
@end
/*
* NSObject+Sum.m
*/
#import "NSObject+Sum.h"
@implementation NSObject (Sum)
- (int)makeSum:(void(^)(SumManager *))block{
SumManager *mgr = [[SumManager alloc] init];
block(mgr);
return mgr.result;
}
@end
网友评论