作者:gaoyizhen92 | 来源:互联网 | 2023-09-24 14:07
oc中有种语法叫 块 ,块的作用通常用来回调,例如 c语言的 qsort函数就需要传入一个自定义函数(实际是函数的地址),qsort函数通过调用这个自定义函数来确定两个要比较内容的大小,由于java中没有指针,所以java中经常采用匿名内部类来实现,oc的块可以说是一个匿名的函数。
定义块的语法格式如下
^ [ 返回值类型 ] (形参类型1 参数1,形参类型2 参数2, 。。。){
}
这种定义跟c语言中函数定义很像,只不过前面多了一个^ ,而且返回值类型是可选的,即 写不写都行,同时块不需要声明 块 名称。
定义块时可以赋值给一个变量,以便以后能多次调用该块
例如:
int (^ fun) (double , double ); // 定义块变量 funfun = ^ int ( double num1 , double num2 ) {return num1 > num2 ;};接下来就可以这样调用了 int isBig= fun(1.2 ,2.0);NSLog(@"%d ",isBig);
还可以使用匿名的方式(类似java匿名内部类) :
#import void show(NSString*str, NSString* (^ decorate )(NSString*) ){NSString*ss=decorate(str);NSLog(ss);
}
int main(int argc,const char * argv[]) {@autoreleasepool {show(@"haha" , ^ NSString* ( NSString* ss ){return [ssstringByAppendingString: @"--no name function"];});}return 0;
}
例如我们要实现一个通用的排序工具,其他用户只要简单的调用一下就可以排序,但只有用户知道自己要比较的大小,所以比较的功能可以留给用户来实现,那我们只需要接受用户要比较的参数数组,和一个符合我们特定要求的比较函数或块 就可以了,让用户自己实现这个比较函数或块。