Block ^托字符(凸起符)
Block保存的是 有特定功能的函数体
int (^Block)(int a, int b) = ^初值(跟前面类型要一致)
block重命名typedef <#returnType#>(^<#name#>)(<#arguments#>);
int (^Block)(int a, int b) = ^int (int a, int b){
return a + b;
};
写⼀个 返回值为整型 参数为NSString(仅⼀个参数)的block,实现将字符串转换为整型的功能
NSInteger (^traceBlock)(NSString *str) = ^NSInteger(NSString *str){
NSInteger intValue = [str intValue];
return intValue;
};
NSLog(@"%ld",traceBlock(@"111"));
block的类型:NSInteger (^)(NSString *str)
block的名称:traceBlock
block的值
匿名的函数 并且类型与block类型相同
匿名函数是函数 其函数中定义的变量 存在:(栈区)
block的优势:
当把block当做一个参数,传入方法中 可以灵活掌握block的实现,也就是你传入的block实现的是什么功能,你这个方法 就实现什么功能
block排序
实现部分:填写obj和obj2的关系
实现原理: 数组中两个元素进行比较
比较后 返回值 如果前面比后面大 则交换
经此比较到最后一个元素 完成排序
compare:可以比较的类型:字符串类型 和 NSNumber类型
直接在block内部实现功能
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"4",@"1", nil];
[array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSString *str1 = (NSString *)obj1;
NSString *str2 = (NSString *)obj2;
if ([str1 compare:str2] > 0) {
return NSOrderedDescending;
}else if([str1 compare:str2] == 0){
return NSOrderedSame;
}else{
return NSOrderedAscending;
}
}];
NSLog(@"%@",array);
先完成block再调用
Person *per1 = [Person personWithName:@"秦倚天" age:18];
Person *per2 = [Person personWithName:@"李淳罡" age:66];
Person *per3 = [Person personWithName:@"曹长卿" age:50];
Person *per4 = [Person personWithName:@"洛阳" age:32];
Person *per5 = [Person personWithName:@"叶温柔" age:25];
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:per1,per2,per3,per4,per5, nil];
NSComparisonResult (^nameCompare)(id ,id ) = ^NSComparisonResult(id obj1,id obj2){
Person *p1 = (Person *)obj1;
Person *p2 = (Person *)obj2;
if ([[p1 name] compare:[p2 name]] > 0) {
return NSOrderedDescending;
}else if([[p1 name] compare:[p2 name]] == 0)
return NSOrderedSame;
else{
return NSOrderedAscending;
}
};
[array sortUsingComparator:nameCompare];
NSLog(@"%@",array);
block内部变量修改
1.在block的实现(值)中,直接修改局部变量是不行的
2.需要添加关键字(声明的时候) __block(两个下划线)才能修改
3.在block实现(值)中 可以直接修改全局变量 不需要添加关键字
__block int num = 5;
BOOL (^B)(NSString *, NSString *) = ^BOOL(NSString *str1,NSString *str2){
num = 3;
NSLog(@"%d",num);
num2 = 5;
NSLog(@"%d",num2);
return [str1 isEqualToString:str2];
};
NSLog(@"%d",B(@"2313",@"2313"));
字面量
字面量,又称语法糖
切记:字面量或者语法糖初始化 用的是类方法初始化
NSArray *array1 = [NSArray arrayWithObjects:@"1",@"2",@"3", nil];
// 相当于
NSArray *arrayN = @[@"1",@"2"];
// 取出一个元素
[arrayN objectAtIndex:1];
// 相当于 array[1]
.......