今天和大家一起來學(xué)習(xí)一下Block的基本使用榕栏,有疏忽的地方,還望各位不吝賜教胯陋。
一蕊温、Block表達(dá)式和基本使用
1、表達(dá)式
// ^id(int x , int y)
/* 完整的block類型 最好抽離成代碼塊 系統(tǒng)提供的inlineBlock是缺少返回值類型的遏乔,完整的block表示如下 等號(hào)前面是block的定義义矛,等號(hào)后面是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 作為屬性 在合適的時(shí)候調(diào)用方法
/** block定義作為屬性 */
p.run = ^() {
NSLog(@"執(zhí)行對象中的block");
};
/** block定義作為屬性調(diào)用時(shí)機(jī) */
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
self.p.run();
}
// block 作為參數(shù) 外界不調(diào)用盟萨,留給內(nèi)部調(diào)用
[p eat:^{
NSLog(@"吃東西");
}];
// Person.h
/** block定義 作為屬性 */
@property (nonatomic, copy) void(^run)();
/** 作為方法參數(shù) */
- (void)eat:(void(^)())block;
// Person.m
- (void)eat:(void(^)())block{
NSLog(@"在person里面調(diào)用block");
// 這里調(diào)用相當(dāng)于執(zhí)行下面一段代碼
/*
[p eat:^{
NSLog(@"吃東西");
}];
*/
block();
}
- 返回值
Person *p = [[Person alloc] init];
// block 作為返回值
// 希望p.run 來調(diào)用
// 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 是方法調(diào)用者
return ^Person *(int x) {
_result += x;
return self;
};
}
二制轰、鏈?zhǔn)秸{(diào)用
1、以加法運(yùn)算為例
/*
* 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
/* 分類實(shí)現(xiàn)
* 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