C in ObjC系列(1) 回圈

C in ObjC系列(1) 回圈

C in ObjC系列为Objective-C中保留C语言语法的系列介绍。

回圈

回圈是每个程式语言都具备的功能,Objective-C沿用C语言的回圈语法,下面的范例使用多种回圈的语法来完成相同的结果,会印出变数内容4、3、2、1依序递减。

while {}

    while (<#condition#>) {
        <#statements#>
    }

  • 先判断 <#condition#> 符合条件就执行回圈内程式
  • <#statements#> 程式内容
//-----------start-----------
    NSInteger m = 4;
    while (m > 0) {
        NSLog(@"%ld",m);
        m = m -1;
    }
//------------end------------

m > 0 执行回圈。

输出结果:

2014-08-17 14:48:20.496 LoopDemo[64502:303] 4
2014-08-17 14:48:20.496 LoopDemo[64502:303] 3
2014-08-17 14:48:20.496 LoopDemo[64502:303] 2
2014-08-17 14:48:20.497 LoopDemo[64502:303] 1

do {} while

    do {
        <#statements#>
    } while (<#condition#>);

  • 先执行 do ... while的程式后再判断<#condition#> 符合条件就继续执行回圈内程式
  • <#statements#> 程式内容
//-----------start-----------
    NSInteger m = 4;
    do {
        NSLog(@"%ld",m);
        m = m -1;
    } while (m > 0);
//------------end------------

m > 0 执行回圈。

输出结果:

2014-08-17 14:51:02.062 LoopDemo[64562:303] 4
2014-08-17 14:51:02.062 LoopDemo[64562:303] 3
2014-08-17 14:51:02.063 LoopDemo[64562:303] 2
2014-08-17 14:51:02.063 LoopDemo[64562:303] 1

for {}

    for (<#initialization#>; <#condition#>; <#increment#>) {
        <#statements#>
    }

  • <#initialization#> 初始值,可以在此定义新的变数或是用已知的
  • <#condition#> 条件成立时继续执行回圈内程式
  • <#increment#> 初始值变数变化算式
  • <#statements#> 程式内容
//-----------start-----------
    for (NSInteger m = 4; m > 0; m = m - 1) {
        NSLog(@"%ld",m);
    }
//------------end------------

m 变数初始值为4,每次执行回圈后将m减1,如果 m > 0的话继续执行回圈

2014-08-17 14:58:27.218 LoopDemo[64742:303] 4
2014-08-17 14:58:27.218 LoopDemo[64742:303] 3
2014-08-17 14:58:27.219 LoopDemo[64742:303] 2
2014-08-17 14:58:27.219 LoopDemo[64742:303] 1

for in {}

    for (<#type *object#> in <#collection#>) {
        <#statements#>
    }

  • <#collection#> 列举(寻访)的物件
  • <#type *object#> 列举(寻访)中取得的物件型态
  • <#statements#> 程式内容

这虽然在原先C的定义中未有此功能,但Objective-C将for增加在物件上使用会有列举(寻访)的功能,它会依照物件的连结关系将物件一一列举(寻访),直到物件无法再列举(寻访)为止,范例会将要印出的数值变数存入阵列中,再使用for将阵列列举出来。

//-----------start-----------
    NSArray *m = @[@4,@3,@2,@1];

    for (NSNumber  *mm in m) {
        NSLog(@"%ld",[mm integerValue]);
    }
//------------end------------

输出结果:

2014-08-17 15:13:26.162 LoopDemo[64922:303] 4
2014-08-17 15:13:26.162 LoopDemo[64922:303] 3
2014-08-17 15:13:26.162 LoopDemo[64922:303] 2
2014-08-17 15:13:26.163 LoopDemo[64922:303] 1

此语法在许多物件语法中都会提供该功能,像:Java、Python…等。

break、continue

有时,执行回圈时,你会因为某些条件成立后想要确即的离开回圈,或是条件成立后,想要跳离次此的回圈,继续下一个回圈,要达成这二种功能,程式语言提供了continuebreak

  • continue 跳离次此回圈不执行后面的程式内容,但不离开回圈,直接下一次回圈
  • break 中断回圈不执行后面的程式内容,并且离开回圈
//-----------start-----------
    NSArray *m = @[@4,@3,@2,@1];

    for (NSNumber  *mm in m) {

        if ([mm integerValue] == 3) {
            NSLog(@"continue");
            continue;
        }

        if ([mm integerValue] == 2) {
            NSLog(@"break");
            break;
        }

        NSLog(@"%ld",[mm integerValue]);
    }
//------------end------------

mm = 3时印出continue后不执行后面的程式内容,直接执行下一个回圈判断式,并且mm = 2时,印出break后跳离此回圈并且不执行后面的程式内容,所以程式中只会印出数值4

输出结果:

2014-08-17 15:33:18.190 LoopDemo[65172:303] 4
2014-08-17 15:33:18.190 LoopDemo[65172:303] continue
2014-08-17 15:33:18.191 LoopDemo[65172:303] break