⼀、Block语法
Block本质就是匿名函数
Block 声明:
脱字符(^) 返回值类型 (参数列表) {
实现功能的代码段
如果block有返回值,需要return
};
// 定义block 实现返回两个数的最大值
^ int (int a, int b) {
return a>b ? a:b;
};
二、Block使用
不常用:
int(^maxBlock)(int,int) = ^int(inta,intb) {
return a>b? a:b;
};
NSLog(@"%d", maxBlock(5,4));
Block进行typedef:
typedef int (^BlockType)(int x,int y)
原类型:int (^)(int x,int y)
新类型:BlockType
main前:
typedef int(^MaxBlock)(int, int);
main:
MaxBlock block2 = ^(int a, int b) {
return a>b ? a:b;
};
NSLog(@"%d",block2(5,4));
Block权限:
block外局部变量:只读
静态变量、全局变量、__block修饰的局部变量:读写
以block作为方法的参数
1.student对象负责调用block
2.Student外部负责定义bloc,并作为方法的参数传入
typedefvoid(^SayBlock)();
- (void)sayHello:(SayBlock)block;
{
// 调用block实现打招呼
block();
}
main:
[stu sayHello:^{
NSLog(@"Hello");
}];
三、Block与数组排序
1.typedef block的简单使用
#import...
// 中间至少空一行!
typedef NSString*(^AppendBlock)(NSString *, NSString *);
@interface
NSString * (^appendBlock) (NSString *, NSString *) = ^(NSString * str1, NSString * str2);
@end
@implementation
NSString * (^appendBlock) (NSString *, NSString *) = ^(NSString * str1, NSString * str2) {
return [str1 stringByAppendingString:str2];
};
@end
main.m
NSLog(@"%@",appendBlock(@"Hi",@" Block!"));
NSMutableArray * arr1 = [NSMutableArrayarrayWithObjects:@"abc3", @"abc2", @"abc5", @"abc4", nil];
NSLog(@"arr1=%@",arr1);
2.^NSComparisonResult 排序
// 升序
[arr1 sortUsingSelector:@selector(compare:)];
// 降序
[arr1 sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
// 返回值:NSComparisonResult 两个值的比较结果
// 参数:数组中两个相邻的对象
// 数组在调用block时,传入相邻的两个数组对象;在block内部,根据排序规则编写实现代码,并返回比较结果
// 对象类型声明
NSString * str1 = (NSString *)obj1;
NSString * str2 = (NSString *)obj2;
return [str2 compare:str1]; // str2>str1时排序
}];
// ui降序
[arr2 sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 UIScore]<[obj2 UIScore];
}];
// name升序
[arr2 sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
Student * s1 = (Student *)obj1;
Student * s2 = (Student *)obj2;
return [s1.name compare:s2.name];
}];
3.block作为参数的使用
#pragma mark -- 对三门课程分数操作
.h
typedeffloat(^ScoreBlock)(float, float, float);
.m
- (void)handleScore:(ScoreBlock)block
{
float result = block(_CScore, _OCScore, _UIScore); //2.
NSLog(@"result = %.1f", result); //4.
}
main.m
[stu handleScore:^float(float CScore, float OCScore, float UIScore) { //1.
float sum = CScore + OCScore + UIScore; //3.1
return sum / 3; //3.2
}];
执行顺序:
1.调用handleScore方法;
2.handleScore中给block发送消息;
3.在调用方法处执行操作,直到return;
4.执行handleScore中剩余操作。
四、字面量
#pragma mark -- 字面量 --
// 1、字符串
NSString * name = @"hi";
// 2、创建不可变数组
NSArray * nameArray = @[@"奥特曼", @"小怪兽"];
// 3、访问数组元素
NSLog(@"%@",nameArray[0]);
// 4、创建NSNumber对象
NSNumber * age = @12;
// 5、创建不可变字典
NSDictionary * dic = @{@"key1":@"value1", @"name":@"hi", @"age":@18, @"gender":@"男"};
NSLog(@"%@",dic);
// 6、访问字典中键值对的value
NSLog(@"%@",dic[@"gender"]);