Objective-C class 定义一个物件(object),该物件含有资料和一些行为。有时可能只是些简单的任务或行为单元,而不是一个方法。类似於Swift closure
。
此时可以使用 Blocks,它可以创建不同的 code 片段,这些片段像值(value)一样传给方法。
Blocks 是 Objective-C objects,这意味着它们可以被加到像 NSArray 或 NSDictionary 中。
returntype (^blockName)(argumentType);
returntype (^blockName)(argumentType)= ^{
};
ex.
void (^simpleBlock)(void) = ^{
NSLog(@"This is a block");
};
调用
simpleBlock();
这是一个简单的范例,用来实现和调用带有参数与返回值的 block
int (^add) (int, int) = ^ (int num1, int num2){
return num1 + num2;
};
int addValue = add(2,4);
NSLog(@"addValue值为:%d",addValue);
有点类似Swift @escaping
的概念,以下有个简单范例:
#import <Foundation/Foundation.h>
// Block
typedef void (^CompletionBlock)();
@interface SampleClass : NSObject
- (void)actionWithCompletion:(CompletionBlock)completionBlock;
@end
@implementation SampleClass
- (void)actionWithCompletion:(CompletionBlock)completionBlock {
NSLog(@"123123");
completionBlock();
}
@end
int main () {
SampleClass *sampleClass = [[SampleClass alloc] init];
[sampleClass actionWithCompletion:^{
NSLog(@"测试成功");
}];
return 0;
}
结果:
2021-09-25 01:30:12.513299+0800 TestOC[42625:1157919] 123123
2021-09-25 01:30:12.513847+0800 TestOC[42625:1157919] 测试成功
如果类型定义带有参数的话...
import <Foundation/Foundation.h>
// block有两个类型为 string 的参数
typedef void (^CompletionBlock)(NSString *str1,NSString *str2);
@interface SampleClass : NSObject
- (void)actionWithCompletion:(CompletionBlock)completionBlock;
@end
@implementation SampleClass
- (void)actionWithCompletion:(CompletionBlock)completionBlock {
//前为 str1, 後为 str2, 有先後之分
completionBlock(@"tom",@"iOS developer");
}
@end
int main () {
SampleClass *sampleClass = [[SampleClass alloc] init];
[sampleClass actionWithCompletion:^(NSString *str1, NSString *str2) {
NSLog(@"我是 %@,职位: %@",str1,str2);
}];
return 0;
}
结果:
2021-09-25 01:36:01.848974+0800 TestOC[42683:1162447] 我是 tom,职位: iOS developer
<<: Day 0x18 UVa10415 Eb Alto Saxophone Player
今天要来介绍 Google Cloud 中的 App Engine,App Engine 是一款 P...
来到了办公桌座位,打开电脑萤幕,拿起滑鼠准备查阅未开封的信件,开始一天的早晨。这一整段过程看似简单,...
在这四个选项中,开发信息安全管理系统(ISMS)是最合适,最关键的。ISMS从管理承诺和政策开始,这...
接续上一篇的故事,阿明跟小美又经过了几次的对话与讨论,在便利贴专案中整理归纳了下列这几个关键字: C...
上一篇在实作 EtaResponseMapper 的时候我们用了 Java 8 开始有的 Insta...