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 风格的 for
或 while
有点不同。你自己不直接控制循环变量。相反,该语言将遍历 "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
形式(例如,没有内置类型允许你每次将计数器加倍),但对于日常使用,有一个整洁的(希望更具可读性) ) 没有的方法。
我已经编码大约 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 风格的 for
或 while
有点不同。你自己不直接控制循环变量。相反,该语言将遍历 "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
形式(例如,没有内置类型允许你每次将计数器加倍),但对于日常使用,有一个整洁的(希望更具可读性) ) 没有的方法。