Block和指针类似:
还记得指针函数怎么写么?下面先写一个指针函数:
因为可以用typedef,也可以不用,就有两种写法了
1(用typedef).先在main函数外部写函数
int sum(int x,int y);
int sum(int x,int y){
return x + y;
}
typedef int(*PFUN) (int x,int y);
然后再再main函数内部调用:
PFUN p = sum;
int a = p(3,5);
NSLog(@"a = %d",a);
2.不用typedef:现在main函数外部写函数:
int sum(int x,int y);
int sum(int x, int y){
return x + y;
在函数内部实现:
int(*p)(int x, int y) = NULL;
p = sum;
int a = p(3,5);
NSLog(@"a = %d",a);
课前回顾:
函数:实现某种功能的代码片段
C语言函数语法格式:
返回值类型 函数名 形参列表
int maxValue(int x,int y);
OC语言函数语法格式:
类型标识符 (函数返回值类型 ) 参数形容词(函数名):参数类型 参数名
- (NSString *)getValueName:(NSString *)name;
完整的函数包括三部分:1.函数声明 2.函数定义 3.函数调用(如果不调用,那么函数不会自动执行)
5个区域: 栈 堆 静态 常量 代码(函数名)
下面是今天学习的Block
1.定义:Block是块语法,本质上是匿名函数(没有名称的函数)。标准C语言里没有匿名函数,在C语言后期的版本中才加入了匿名函数。在C++,Js,Swift中也有类似的语法叫做闭包。
例子:int multiplier = 7;
int (^myFirstBlock)(int) = ^int(int number){
return number * multiplier;
};
int b = myFirstBlock(7);
NSLog(@"b = %d",b);
输出结果是:49 (即7 * 7 = 49)
其中:
int: block块的返回值类型
(^myFirstBlock): ^是block类型标示符,nyFirstBlock是块语法的名字
(int): 括号内是block的类型参数,可以有多个参数或者是没有参数,没有参数用void
=: 等号右边是定义块对象的语法结构(相当于函数的定义)然后给myFirstBlock的返回值赋值
^: block的类型标示符
int: Block类型的返回值
(int number): 参数列表,这个地方必须有参数名
{}: block内部实现
;: 不要忘记以分号结尾
2.Block类型 :int (^)(int)
Block变量名 :myFirstBlock
Block : ^int (int num)p{return 7 * num;};
^返回值类型(参数名){函数体};其实返回值类型可以省略
3.根据参数和返回值,block也可以分为4中:
(1).有参有返
(2).有参无返
(3).无参无返
(4).无参有返
4。练习:写一个返回值为整型 参数为NSString(仅一个参数)的block,实现将字符串转化为整型的功能
int(^myFirstBlock)(NSString *) = ^int(NSString * numberStr){
//字符串转化为整型的方法
return numberStr.intValue;
};
int b3 = myFirstBlock(@"1234");
NSLog(@"b3 = %d",b3);