循环与跳出,以及块

循环语句

循环可用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);});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值