c-style for 语句被扭曲弃用

c-style for statement deprecated with a twist

我已经编码大约 2 年了,但我仍然很糟糕。任何帮助将非常感激。我一直在使用下面的代码来设置我的背景图片参数,在更新到 Xcode 7.3 之后我收到了警告 'C-Style statement is deprecated and will be removed':

for var totalHeight:CGFloat = 0; totalHeight < 2.0 * Configurations.sharedInstance.heightGame; totalHeight = totalHeight + backgroundImage.size.height  {...}

澄清一下,我查看了其他一些 solutions/examples,我注意到一种解决方法是使用 for in 循环,但是,我似乎无法理解这个问题一,我尝试过的一切似乎都不起作用。同样,任何帮助将不胜感激。

最好使用 while 循环:

var totalHeight: CGFloat = 0
while totalHeight < 2.0 * Configurations.sharedInstance.heightGame {
    // Loop code goes here

    totalHeight += backgroundImage.size.height
}

一个始终有效的策略是将您的 for 循环转换为 while 循环,遵循以下模式:

for a; b; c {
  // do stuff
}

// can be written as:

a // set up
while b { // condition
  // do stuff
  c // post-loop action 
}

所以在这种情况下,您的 for 循环可以写成:

var totalHeight: CGFloat = 0
while totalHeight < 2.0 * Configurations.sharedInstance.heightGame {
  // totalHeight = totalHeight + backgroundImage.size.height can be
  // written slightly more succinctly as:
  totalHeight += backgroundImage.size.height
}

但是你是对的,首选的解决方案是尽可能使用 for in

for in 与 C 风格的 forwhile 有点不同。你自己不直接控制循环变量。相反,该语言将遍历 "sequence" 产生的任何值。序列是任何符合协议 (SequenceType) 的类型,它可以创建一个生成器,一个接一个地为该序列提供服务。很多东西都是序列——数组、字典、索引范围。

有一种称为步幅的序列,您可以使用它来解决使用 for in 的特定问题。步幅有点像范围,可以更灵活地增加。您指定一个 "by" 值,即每次变化的量:

for totalHeight in 0.stride(to: 2.0 * Configurations.sharedInstance.heightGame,
                            by: backgroundImage.size.height) {

    // use totalHeight just the same as with the C-style for loop

}

请注意,有两种跨步方式,to:(最多但不包括,就像您使用 < 一样)和 through:(最多并包括, 比如 <=).

使用 for in 循环的好处之一是不需要使用 var 声明循环变量。相反,每次循环你都会得到一个全新的不可变(即常量)变量,这有助于避免一些细微的错误,尤其是闭包变量捕获。

你仍然偶尔需要 while 形式(例如,没有内置类型允许你每次将计数器加倍),但对于日常使用,有一个整洁的(希望更具可读性) ) 没有的方法。