2017-04-15 10 views
-8

このコードをswift 3.0に書く方法。 Forループを使用しますか?このコードをswift 3.0に書く方法。 Forループを使用して

for (int index = 0; index < 100; index += (1 + index)) {   
    printf("%d\t",index);  
} 
+1

そのコードは無意味なようです。 これは奇妙な結果をもたらすでしょう。 SwiftはCスタイルの 'for(;;)'構造を持っていないので、whileループでビルドする必要があります。 これは私の宿題のようなにおいがします。それは...ですか? –

+0

関連:http://stackoverflow.com/a/42662061/1630618 – vacawama

答えて

1

増加が増加しています。ループのためのCスタイルは、あなたがこのようなコードを使用する可能性があり、使用できないので:

var index = 0 
while index < 100 { 
    print("\(index)", terminator: "\t") 
    index += 1 + index 
} 
print("") 

あなたはまた、機能的なスタイルで、このコードを書くことができます。

for f in sequence(first: 0, 
        next: { 
        $0 + $0 + 1 
}) 
    .prefix(while: {$0 < last}) { 
    print(f, terminator: "\t") 
} 
print("") 

(プレフィックス機能はスウィフト3.1が必要です)

+0

ターミネーターでの印刷を含む正しい翻訳が承認されました。 – vacawama

1

この種類のforループはCから来ており、Swift言語のデザインと精神に反する。そのため、Swift 3では削除されました(削除の詳細についてはhereをご覧ください)。ループの

C-スタイルは3つの文があります

まず、あなたが1つ以上の変数を設定初期化ステートメント、があります。この場合、初期化ステートメントは次のとおりです。

スウィフトに

var index = 0 

なり

int index = 0 

その後、非常に開始時と終了時に真でなければならない条件である不変ループ、がありますループの各パスのこの場合、ループ不変量は次のようになります。

index < 100 

スウィフトコードはCコードとほとんど同じです。

そして最後に、私は別のパスがループを介して行われる必要があるかどうかを確認するために評価される必要があるループ内でいくつかの条件への変更を、作る変更ステートメント、呼んでいるものがあります。

index += 1 + index 

は再び、スウィフトコードはかなりCコードと同じである。この場合、それはこの文です。

あなたは、whileループを使用する必要があり、かつ同等のスウィフトコードは次のようになります。

while index < 100 { 
    print("\(index)\t") 
    index += 1 + index 
} 

index += 1 + indexコード、有効な一方で、珍しいです。あなたはそれを望んでいますか、より一般的なものを希望しましたindex += 1

+0

良い、明確なステップバイステップの答えです。 1つのマイナーポイント。 C 'printf()'関数は、Swift 'print()'関数がデフォルトで行う行を終了しません。私の答えでは、通常の改行をタブで置き換えるオプションのターミネータパラメータを提供します。あなたのコードは新しい行のループの各ステップを表示しますが、これは提供されるCコードとは異なります。 –

0

あなたがforループを使用しなければならない場合は、シーケンスを使用することができますが、それは、whileループよりも冗長で面倒なことになります。

for index in sequence(first:0, next:{ let index = $0 + $0 + 1; return index < 100 ? index : nil}) 
{ 
    print("\(index)") 
} 

あなたはまた、ジェネリックを使用して任意のタイプと刻みにこれを一般化することができ関数:

func cFor<T>(_ start:T, _ condition:@escaping (T)->Bool, _ increment:@escaping (inout T)->()) -> UnfoldSequence<T, (T?, Bool)> 
{ 
    return sequence(first:start, next:{ var next = $0; increment(&next); return condition(next) ? next : nil }) 
} 

for index in cFor(0,{$0<100},{$0 += $0 + 1}) 
{ 
    print("\(index)") 
} 
関連する問題