循环语句
循环可用for、while、do while
break、continue、return、goto
break是跳出循环语句,不会继续之后的循环
continue是跳出本次循环,然后继续之后的循环
return是跳出函数并返回值
goto会无条件跳转到标签所示位置,然后继续执行代码,由于无规则限制,可读性低,故在code中非必要情况下需尽量避免使用,可在多层嵌套循环中需要跳出时使用
for(int i = 0; i < 10; i++)
{
NSLog(@"i的值为%d", i);
if(i == 5)
{
//goto 会直接跳转到outer标签处
goto outer;
}
}
//此处为outer标签,格式为 标示符:
outer:
NSLog(@"循环结束");
块
块的基本语法:
^ [块返回值类型] (形参类型1 形参1, 形参类型2 形参2...)
{
//块执行体
}
与定义函数的的语法格式差异如下
- 定义块必须以 ^ 开头
- 定义块的返回值类型可以省略,而且经常都会省略声明快得返回值类型
- 定义块无需制定名字
- 如果块没有返回值,块无需带参数,通常建议使用 void 作为占位符
定义块变量的语法格式:
块返回值类型 (^块变量名) (形参类型1, 形参类型2...);
//定义不带参数、无返回值的块
void (^printStr) (void) = ^(void)
{
NSLog(@"我正在学习块");
};
//使用printStr块
printStr();
//定义带参数、有返回值的块
double (^hypot) (double, double) = ^(double num1, double num2)
{
return sqrt(num1*num1+num2*num2);
};
//调用块病输出块的返回值
NSLog(@"块的返回值为%g",hotpot(3, 4));
//也可以先之定义块变量
void (^print) (NSString*)
//再将块赋给制定的快变量
print = ^(NSString* info)
{
NSLog(@"info参数为:%@", info);
};
//调用块
print(@"先定义再赋值");
块中的局部变量:
块可以访问程序中局部变量的值,但不允许修改局部变量的值,且块中的局部变量是在定义块的时候就把局部变量的值保存在块中,而不是执行块的时候采取获取局部变量的值。
int my = 20; //定义局部变量
void (^printMy1) (Void) = ^(void)
{
my = 30; //块中尝试修改局部变量的值,程序会报错
NSLog(@"my = %d", my); //访问局部变量的值是允许的
};
my = 45; //再次将my赋值为45
printMy(); //由于在定义块的时候my的值就已经保存到块中,所以即使定义块之后,再次在函数中修改my的值,块中的my仍旧为20,此处忽略块中修改局部变量的错误,将之注释掉
若要块每次使用局部变量都实时去获取局部变量本身的值,且允许在块中修改局部变量的值,则需要用 _block 来修饰局部变量。
_block int my = 20; //定义 _block 修饰的局部变量my
void (^printMy) (void) = ^(void)
{
NSLog(@"my = %d", my);
my = 30;
NSLog(@"my = %d", my);
};
my = 45;
printMy(); //由于定义my时被 _block 修饰过,所以调用块的结果为 45 30
NSLog(@"块执行结束后,my = %d", my); //由于定义my时被 _block 修饰过,所以调用块中对my的修改是生效的,此处输出为 30
使用typedef定义块变量类型
用途:
- 复用块变量类型
- 可定义含快变量参数的函数,且块变量只能存在一个且作为最后一个参数
格式:
typedef void (^printBlock) (int); //使用 typedef 定义块变量类型
//使用 printBlock 定义块变量,并将制定块赋给该变量
printBlock print = ^(int num)
{
NSLog(@"%d", num);
};
print(24); //调用 print 块,输出值 24
void printArray(int array[], unsigned int len, printBlock printA)
{
for(int i = 0; i < len; i++)
{
printA(array[i]); //将数组元素作为参数调用块
}
}
int arr[] = {2, 4, 6}; //定义数组arr
// ^(int num){NSLog(@"元素的平方为 %d", num*num);} 为块参数
printArray(arr, 3, ^(int num){NSLog(@"元素的平方为 %d", num*num);});