设为首页 加入收藏

TOP

Objective-C中Block语法、Block使用以及通过Block实现数组排序
2015-07-16 12:57:27 来源: 作者: 【 】 浏览:6
Tags:Objective-C Block 语法 使用 以及 通过 实现 排序

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


标准C里面没有Block,C语言的后期扩展版本,加入了匿名函数


C++、JS、Swift等语言有类似语法,叫做闭包


Block语法和C语言里的函数指针很相似,下面我们先来回顾下C语言中的函数和函数指针


C语言中函数是指:实现某一功能的代码段


完整的函数包括两部分:函数声明、函数定义


函数声明,即函数原型。例如:int sum (int x,int y);具有两个整形参数,一个整形返回值的函数


函数定义,即函数实现。例如:int sum(int x,int y){


return x + y;


}


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


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


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


函数指针变量:p


函数指针的值:sum


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


例如:int (int x,int y)


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


Block类型:int (^)(int)


Block变量:myBlock


Block值:^int (int num) {return 7*num;}


即:^返回值类型(参数列表){函数体}其中返回值类型可以省略


例如:写一个 返回值为整形 参数为OC字符串(仅一个参数)的block,实现将字符串转换为整形的功能


?int (^myBlock)(NSString *) = ^(NSString *string) {


? ? ? ? return [string intValue];


? ? };
? ? NSLog(@"%d",myBlock(@"123"));


block的数据类型代表了匿名函数的格式(返回值类型,形参的类型)


block变量的定义与函数指针变量的定义类似,唯一区别于函数指针变量的是变量名前通过脱字符(^)修饰


首先应该用^修饰,剩余的部分与C语言函数定义一致,最大的不同就是没有函数名(同时返回值类型也可以省略)


block变量在定义时具有变量定义的基本特征,赋值号右侧的匿名函数可以当做一个整体被赋值,类似于 int a = 5;


block变量所赋的值是匿名函数。又兼具函数的特征,并且是唯一可以定义在某个函数实现内部(C语言中认为函数是不能嵌套定义的,block是个特例)


Block进行typedef


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


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


新类型:BlockType


类比函数指针的类型定义,格式与函数指针一致,类型定义一定程度上简化了block的使用。


? ? typedef int (^SumType)(int,int);
? ? SumType sumBlock = ^(int x,int y) {
? ? ? ? return x + y;
? ? };
? ? int result = sumBlock(5,4);
? ? NSLog(@"%d",result);


?


?__block类型标识可以运行局部变量在其后续定义的block内部正常访问,


? ? __block int num = 0;


? ? void (^testBlock)() = ^() {
? ? ? ? for (int i = 0; i < 10; i++) {
? ? ? ? ? ? count++;
? ? ? ? ? ? num++;
? ? ? ? ? ? NSLog(@"%d",count);
? ? ? ? }


? ? };


block调用


? ? testBlock();?


?


数组使用Block排序



数组使用Block对两个字符串进行比较


? ? NSComparisonResult (^compareBlock)(NSString *,NSString *) = ^(NSString *str1,NSString *str2) {


? ? ? ? return [str2 compare:str1];


//如果是升序返回-1,如果是降序返回1,如果相等返回0


? ? };


? ? NSLog(@"%ld",compareBlock(@"11",@"12"));



? ? NSArray *array = @[@1,@2,@13,@12,@23];
? ? NSArray *resultArray1 = [array sortedArrayUsingSelector:@selector(compare:)];
? ? NSLog(@"%@",resultArray1);


数组使用Block排序? ? 降序排列


? ? NSComparator sortBlock = ^(id obj1,id obj2) {


? ? ? ? return [obj2 compare:obj1];
? ? };
? ? NSArray *resultArray2 = [array sortedArrayUsingComparator:sortBlock];
? ? NSLog(@"%@",resultArray2);


升序序排列


? NSArray *resultArray3 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {


? ? ? ? return [obj1 compare:obj2];


? ? }];


? ? NSLog(@"%@",resultArray3);


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇浅析Objective-C字面量 下一篇Python入门案例之Hello World!

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: