常に働く戦略は、あなたの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
と少し異なります。自分でループ変数を直接制御することはありません。代わりに、言語は「シーケンス」によって生成された値をループします。シーケンスとは、シーケンスを1つずつ順番に処理するジェネレータを作成できるプロトコル(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
ループで得られる利点の1つは、ループ変数をvar
と宣言する必要がないことです。代わりに、ループのたびに新しい不変(つまり定数)変数が得られます。これは、特にクロージャ変数のキャプチャで、微妙なバグを避けるのに役立ちます。
フォームは時折(たとえば、毎回カウンターを二重にすることができるビルトインタイプはありません)必要がありますが、日常的に使用するには、きちんとしたなし。
この質問はもともとhttp://stackoverflow.com/questions/36213333/fix-warning-c-style-for-statement-is-deprecated-in-swift-3の複製としてマークされていましたが、そこの回答ループのためにfly 1を単純にインクリメントするために働く – JeremyP
OPは完全に正しい。ループ用のCスタイルは、Swiftのどのforループでも容易に再現できない、クールで便利な機能を多数提供します。私の見解では、SwiftからループのためのCスタイルを取ることはひどく不公平でした。 – matt