2016-04-15 9 views
1

私は約2年間コーディングしてきましたが、私はまだひどいです。どんな助けでも大歓迎です。私はXcodeの7.3にアップデートした後、私は警告「C-スタイル文が廃止され、削除されます」しまった、私の背景画像パラメータを設定するには、次のコードを使用している:ステートメントのCスタイルがひねられていない

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

だけ明確にするために、私が見てきました他のいくつかのソリューション/例では、forループを使用する方法があることに気付きましたが、私はこの問題を回避することができませんでした。再び、どんな助けも大いに感謝されるでしょう。

+0

この質問はもともとhttp://stackoverflow.com/questions/36213333/fix-warning-c-style-for-statement-is-deprecated-in-swift-3の複製としてマークされていましたが、そこの回答ループのためにfly 1を単純にインクリメントするために働く – JeremyP

+0

OPは完全に正しい。ループ用のCスタイルは、Swiftのどのforループでも容易に再現できない、クールで便利な機能を多数提供します。私の見解では、SwiftからループのためのCスタイルを取ることはひどく不公平でした。 – matt

答えて

1

は、whileループで行くのがベストされることがあります。

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

    totalHeight += backgroundImage.size.height 
} 
+0

はい、残念ですが、forループを常に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スタイル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と宣言する必要がないことです。代わりに、ループのたびに新しい不変(つまり定数)変数が得られます。これは、特にクロージャ変数のキャプチャで、微妙なバグを避けるのに役立ちます。

フォームは時折(​​たとえば、毎回カウンターを二重にすることができるビルトインタイプはありません)必要がありますが、日常的に使用するには、きちんとしたなし。

関連する問題