iOS开发学习48 lambda表达式
- 一、block 简介
- 二、block使用
- 1. block的写法大概就是这样:
- 2. 带参数的话可以这样写:
- 3. 如果不写入参,可以写:
- 4. 当然返回也可以省略,不过编译器可能会有警告:
- 5. 定义一个block的变量:
- 6. block就可以作为另一个函数的参数
- 7. block 作为类的属性(使用typedef)
- 在头文件中定义
- 在m文件中调用:
- 其它类使用该属性
- 8. 类的方法里使用block
- 头文件
- m文件
- 三、OC自带的使用block的API示例
- 遍历元素
一、block 简介
Block是苹果在ObjectC为C、C++以及Objective-C添加的特性,使得这些语言可以用类lambda表达式的语法来创建闭包。
block不需要写protocol、函数等、注重结果的传输,写法比委托简便。
block的声明:
<返回值类型> + (^<block名字>) + (<参数类型1>, <参数类型2>...)
二、block使用
1. block的写法大概就是这样:
void (^blockTest)(void) = ^{
NSLog(@"block");
};
blockTest();
2. 带参数的话可以这样写:
^ BOOL (int left, int right){
return a > b;
}
3. 如果不写入参,可以写:
(void)^{
NSLog(@"block的使用");}
;
4. 当然返回也可以省略,不过编译器可能会有警告:
^{
NSLog(@"最简捷的block的使用");}
;
5. 定义一个block的变量:
void (^blockWithParm)(int parm) = ^(int count){
NSLog(@"有参无返回值的定义和使用:%d", count);
};
blockWithParm(100);
6. block就可以作为另一个函数的参数
void a(){
void (^block)(int parm) = ^(int count){
NSLog(@"有参无返回值的定义和使用:%d", count);
};
// 把block 传到funcWithParm里作为参数
funcWithParm(block);
}
void funcWithParm(void (^block)(int parm))
{
block(10);
}
7. block 作为类的属性(使用typedef)
在头文件中定义
typedef void (^blockTest)();
@property (nonatomic,copy) blockTest myblock;
在m文件中调用:
if(_myblock){
_myblock();
}
其它类使用该属性
_testClass.myblock = ^{
NSLog(@"block");
}
8. 类的方法里使用block
头文件
+(void) myfunc:(int)someParam myBlock:(nonnull void(^)(NSString* _Nonnull))myBlock;
m文件
+(void) myfunc:(int someParam myBlock:(nonnull void(^)(NSString* _Nonnull))myBlock{
... some code
NSString* ret = @"return value";
myBlock(ret);
}
三、OC自带的使用block的API示例
遍历元素
NSArray *arrChar=[@"A/B/C/D/E/F" componentsSeparatedByString:@"/"];
//遍历元素
[arrChar enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"\nindex:[%d], value:[%@]",idx,obj);
if(idx == 4)
{
*stop=YES;
}
}];