【问题标题】:c-style for statement deprecated with a twist不推荐使用的 c 样式 for 语句
【发布时间】:2016-04-15 15:00:13
【问题描述】:

我已经编写了大约 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  {...}

为了澄清,我查看了其他一些解决方案/示例,我注意到一种解决方法是使用 for in 循环,但是,我似乎无法理解这个和我的所有内容试过好像不行。再次,任何帮助将不胜感激。

【问题讨论】:

  • 该问题最初被标记为 stackoverflow.com/questions/36213333/… 的重复项,但那里给出的答案仅适用于循环的简单递增 fly 1
  • OP 完全正确。 C 风格的 for 循环可以做很多很酷、很方便的事情,这些事情在 Swift 中任何类型的 for 循环都无法轻易复制。在我看来,从 Swift 中移除 C 风格的 for 循环是非常不明智的。

标签: swift for-loop compiler-warnings deprecated


【解决方案1】:

一个始终有效的策略是将您的 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 有点不同。您不能自己直接控制循环变量。相反,该语言将遍历“序列”产生的任何值。序列是符合协议 (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:(最高但不包括,如您使用过&lt;)和through:(最高并包括,如&lt;=)。

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

您仍然偶尔需要while 表单(例如,没有允许您每次将计数器翻倍的内置类型),但对于大部分日常使用来说,有一种简洁(并且希望更具可读性)的方式它没有。

【讨论】:

    【解决方案2】:

    最好使用 while 循环:

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

    【讨论】:

    • 是的,很遗憾,但请记住,for 循环可以始终展开到 while 循环中,这通常是解决此问题的最佳方法。它并不优雅,但可以完成工作。
    • 这行得通,@Slayter。使用 while 循环作为解决方法并没有引起我的注意。我想我太累了。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2020-07-29
    相关资源
    最近更新 更多