2016-04-15 16 views
1

我已經編碼了大約2年,但我仍然很糟糕。任何幫助將非常感激。我一直在使用下面的代碼來設置我的背景圖像參數,更新到的Xcode 7.3後,我得到了警告「C風格的聲明已過時,將被刪除」:c-style用於轉義的陳述棄用

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

只是爲了澄清,我已經看過在其他一些解決方案/示例中,我已經注意到一種解決方法是使用for in循環,但是,我似乎無法將自己的頭圍繞在這個循環中,而我嘗試過的所有內容似乎都不起作用。再次,任何幫助將不勝感激。

+0

該問題最初被標記爲http://stackoverflow.com/questions/36213333/fix-warning-c-style-for-statement-is-deprecated-in-swift-3的副本,但給出的答案在那裏將只; y工作簡單遞增fly 1 for循環 – JeremyP

+0

OP是完全正確的。 C風格的for循環可以做很多很酷,很方便的事情,Swift中的任何一種for循環都不能很容易地複製。在我看來,將C風格從Swift中移除是非常不明智的。 – matt

回答

1

可能是最好的去與while循環:

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

    totalHeight += backgroundImage.size.height 
} 
+0

是的,這是一個遺憾,但請記住for循環可以_always_展開到while循環通常是解決這個問題的最好方法。這不是優雅的,但它完成了工作。 – matt

+0

這工作,@Slayter。使用while循環作爲解決方法並未跨越我的想法。我覺得我太累了。非常感激。 – Dan

4

一個戰略,始終工作在你的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。步幅有點像增加靈活性的範圍。您指定一個「通過」值,是圍繞每個時間改變量:

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表單(例如,沒有內置類型允許您每次增加一個計數器的次數),但是對於日常使用而言,它有一個整潔的(並且希望更具可讀性)的方式沒有。