向Objective-C添加"forCount"控制结构的最佳方法是什么?

Fat*_*tie 2 iphone objective-c

Adam Ko为这个问题提供了一个很棒的解决方案,感谢Adam Ko.

顺便说一句,如果像我一样,你喜欢c预处理器(处理#defines的东西),你可能不知道XCode中有一个方便的东西:右键单击你的一个开源文件的主体,靠近底部.. "预处理".它实际上运行预处理器,向您显示将要编译的内容的整体"真实交易".这很棒!


这个问题是风格和代码清晰度的问题.考虑它类似于关于微妙命名问题的问题,或者可用习语中的最佳选择(更易读,更易于维护).

当然,使用这样的循环:

for(NSUInteger _i=0; _i<20; ++_i)
  {
  .. do this 20 times ..
  }
Run Code Online (Sandbox Code Playgroud)

要明确,效果是做N次.(您没有在正文中使用索引.)

我想清楚地告诉读者这是一个基于计数的循环 - 即,索引是无关紧要的,并且在算法上我们做了N次.

因此,我想要一个干净的方式做一次身体N次,没有皇室纠缠或浪漫的承诺.你可以像这样制作一个宏:

 #define forCount(N) for(NSUinteger __neverused=0; __neverused<N; ++__neverused)
Run Code Online (Sandbox Code Playgroud)

这很有效.因此,

forCount(20)
  {
  .. do this 20 times ..
  }
Run Code Online (Sandbox Code Playgroud)

然而,可以想象,如果它与未来的某些东西发生碰撞,那里使用的"隐藏"变量可能会造成麻烦.(也许如果你嵌套有问题的控制结构,还有其他问题.)

要明确效率等,这里不是问题.已经有一些不同的控制结构(while,do等等)实际上当然是完全相同的东西,但它们仅仅作为一种风格存在并且向读者清楚地表明代码段落的预期算法含义.有问题."forCount"是另一种这样需要的控制结构,因为"索引无关"计数循环在任何算法编程中都是完全基本的.

有谁知道这真的,真的,非常酷的解决方案?提到的#define只是不满意,而且你已经抛出了一个变量名,不可避免地有人会踩到它.

谢谢!


后来...

有几个人基本上问过"但为什么要这样做?"

请看以下两个代码示例:

for ( spaceship = 3; spaceship < 8; ++spaceship )
   {
   beginWarpEffectForShip( spaceship )
   }

forCount( 25 )
   {
   addARandomComet
   }
Run Code Online (Sandbox Code Playgroud)

当然,对于读者来说,这种效果是完全不同的.

毕竟,在c中有很多(完全相同的)控制结构,其中唯一的区别是风格:也就是说,将内容传达给读者.

每当我们触摸键盘时,我们都使用"非索引相对"循环("做5次"),它就像馅饼一样自然.

所以,#define是一个很好的解决方案,有没有更好的方法呢?干杯

小智 6

你可以使用块.例如,

void forCount(NSUInteger count, void(^block)()) {
    for (NSUInteger i = 0; i < count; i++) block();
}
Run Code Online (Sandbox Code Playgroud)

它可以像:

forCount(5, ^{
    // Do something in the outer loop
    forCount(10, ^{
        // Do something in the inner loop
    });
});
Run Code Online (Sandbox Code Playgroud)

请注意,如果需要写入块外部声明的变量,则需要指定__block存储限定符.