主要内容:

⼀、Block语法

⼆、Block使⽤

三、Block实现数组排序

Block简介

Block:块语法,本质上是匿名函数(没有名称的函数)

标准C⾥面没有Block,C语⾔言的后期扩展版本,加⼊了匿名函数。

C++、JS、Swift等语⾔,有类似语法,叫做闭包。 Block语法和函数指针很相似。

回顾函数指针

函数指针(变量):存放函数地址(函数名)的指针变量。

int (*p)(int x,int y) = sum;

函数指针类型:int (*)(int x,int y) 即:指向 两个整型参数,一个整型返回值函数的指针。

函数指针变量:p

函数指针的值:sum

Block

匿名函数:没有名称的函数。

例如 int (int x, int y)

因为Block是匿名函数,block变量存放的函数的实现,通过block变量能直接调⽤用函数

没有名称的函数应该如何调⽤用?(有名称的话,可以直接调⽤,也可以通过函数指针来调⽤用)

//1. ^ :脱字符
//在OC 语言中, '^'表示Block块 //声明一个block 变量
int (^sumBlock) (int, int) = ^(int a, int b){
return a+b;
};
NSLog(@"%d",sumBlock(,));
 int (^maxBlock)(int , int ) = ^(int a, int b){
return a > b ? a:b;
};
int a = maxBlock(,);
NSLog(@"%d",a);

Block返回值类型:int (^maxBlock)(int a, int b)  a,b可以不写

Block变量:a, b

Block变量存储的值:是实现部分

即: ^返回值类型 (参数列表)    函数体

Block 进行typedef

typedef in (^BlockType)(int x, int y)

原类型: int (^)(int x, int y)

新类型: BlockType

//给Block类型起一个别名
typedef int (^MaxBlock) (int, int);
MaxBlock sumBlock1 =^(int a, int b){
return a + b;
};
NSLog(@"%d",sumBlock1(,));

Block与局布变量的关系

//Block 与局部变量的关系

   // int abc = 897;  //局部变量

   //__block修饰后 可以修改局部变量
__block int count = ;
void (^sayHi) (int) = ^(int c){
for (int i = ; i < count; i++) {
NSLog(@"嗨");
}
// abc = 90; //可以使用局部变量,不可修改局部变量 };
sayHi();

Block与局布变量的关系

//全局变量
int count = ;
int main(int argc, const char * argv[])
{
//Block 与全局变量
void (^addNum)(void) = ^(void){
count++;
NSLog(@"count = %d",count);
};
//调用
addNum();
//显示结果
NSLog(@"count = %d",count);
//练习1 用Block实现将字符串转为整形的功能
int (^strint) (NSString *) = ^(NSString *string){
return [string intValue];
};
int num = strint(@"");
NSLog(@"%d",num);

Block数组排序

 //block数组排序
NSArray *stringArray = [ NSArray arrayWithObjects:@"a18",@"",@"",@"", nil]; NSComparator sortBlock = ^(id string1, id string2){
return [string1 compare:string2];
};

//将Block作为参数传递给方法

    NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];
NSLog(@"sortArray:%@",sortArray);
  //使用Block给动态数组进行排序 //不可变数组用法二需要在前面接收一下
NSMutableArray *ageArray = [ NSMutableArray arrayWithObjects:@"", @"", @"", nil];
//法一
NSComparisonResult (^sortBlock) (id, id) = ^(id obj1, id obj2){
if ([obj1 intValue] > [obj2 intValue]) {
return NSOrderedDescending ;
}else if([obj1 intValue] < [obj2 intValue]){
return NSOrderedAscending;
}else{
return NSOrderedSame;
}
};
//将Block作为参数传递给方法
[ageArray sortUsingComparator:sortBlock];
NSLog(@"%@", ageArray);
//法二 (使用这种方法)
[ageArray sortUsingComparator:^NSComparisonResult(id obj3, id obj4) {
if ([obj3 intValue] > [obj4 intValue]) {
return NSOrderedAscending;
}else{
return NSOrderedSame;
}
}];

1. 创建Person类

    实例变量: _name    _age


    方法:初始化方法


               便利构造器


               实例变量的赋值、取值方法


2. 创建3个Person对象,放入数组中


3. 在Person中添加compareByName:方法,使用此方法对数组进行排序,并输出


4. 使用Block根据Person的age进行排序,并输出

//根据age排序
Person *person1 = [ Person personWith:@"da" age:];
Person *person2 = [Person personWith:@"ji" age:];
Person *person3 = [Person personWith:@"ko" age:];
NSMutableArray *array = [NSMutableArray arrayWithObjects:person1,person2,person3, nil];
[array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
if ([obj1 getAge] > [obj2 getAge]) {
return NSOrderedDescending;
}else {
return NSOrderedSame;
}
}];
NSLog(@"%@",array);

字面量

最新文章

  1. elk查询语法
  2. sql语句的单双引号问题
  3. 并发用户数与 TPS 之间的关系
  4. 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
  5. PHP中MySql函数收集
  6. Unity中2D和UGUI图集的理解与使用
  7. java程序练习:数组中随机10个数中的最大值
  8. Zigzag Iterator 解答
  9. MyEclipse取消Show in Breadcrumb的方法
  10. 老李分享:Uber究竟是用什么开发语言?
  11. c语言函数实参与形参整理
  12. Python基础学习参考(四):条件与循环
  13. 审核Memcrashed Drdos攻击代码
  14. [PHP] 简单多进程并发
  15. 关于javascript中arguments的一个很好的例子
  16. 用决策树(CART)解决iris分类问题
  17. Python12/10--前端之display/overflow使用/清浮动的方式
  18. Android 音乐(音效)播放方式总结
  19. 【第八篇】SAP ABAP7.5x新语法之F4增强【续】
  20. pycharm git无法使用问题(待解决)

热门文章

  1. Android UI设计的基本元素有哪些
  2. hdu 3339 In Action (最短路径+01背包)
  3. 用select (多路复用)模拟一个 socket server
  4. ContestHunter暑假欢乐赛 SRM 05
  5. 「LibreOJ NOIP Round #1」七曜圣贤
  6. 解决requests获取源代码时中文乱码问题
  7. Ubuntu Android adb调试无法识别设备 -- List of devices attached ???????????? no permissions
  8. bzoj 1568 [JSOI2008]Blue Mary开公司 超哥线段树
  9. shell脚本--部署应用到tomcat并启动tomcat
  10. 通过反射获取T.class代码片段