一個戰略,始終工作在你的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
。你不直接控制循環變量。相反,該語言將循環由「序列」產生的任何值。序列是符合協議(SequenceType
)的任何類型,可以創建一個將逐個向上提供序列的生成器。很多東西都是序列 - 數組,字典,索引範圍。
有一種叫做步幅的序列,你可以用它來解決這個特殊的問題,使用for in
。步幅有點像增加靈活性的範圍。您指定一個「通過」值,是圍繞每個時間改變量:
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
表單(例如,沒有內置類型允許您每次增加一個計數器的次數),但是對於日常使用而言,它有一個整潔的(並且希望更具可讀性)的方式沒有。
該問題最初被標記爲http://stackoverflow.com/questions/36213333/fix-warning-c-style-for-statement-is-deprecated-in-swift-3的副本,但給出的答案在那裏將只; y工作簡單遞增fly 1 for循環 – JeremyP
OP是完全正確的。 C風格的for循環可以做很多很酷,很方便的事情,Swift中的任何一種for循環都不能很容易地複製。在我看來,將C風格從Swift中移除是非常不明智的。 – matt