2017-03-08 9 views
0

iOSアプリケーションをSwift 3にリファクタリングする作業があります。しかし、Cスタイルのループはforというループがあります。後方に向かって)。Swift 2.2 Swiftのループのための特定のデクリメント3

これはサンプルコードです。原則は同じです。

let array = ["hello", "world", nil, "foo", nil, "bar", "Peter Griffin"] 
var threeLetterWords = 0 
for var i = array.count-1; i >= 0 && array[i].characters.count == 3; --i, ++threeLetterWords { } 
print("Found words: \(threeLetterWords)") // should say `Found words: 2` 

私はstride(from:through:by:)と試みたが、ループの中でそれをインクリメントすることが重要と思われるように私はthreeLetterWordsをインクリメントすることはできません。何か案は?

+0

Cスタイルのforループは、whileループで置き換えることができます。 – vacawama

+1

あなたのコードは、配列の末尾にある3文字の単語の数を数えます。テスト配列の場合は0を返します。 – vacawama

+1

Cスタイルのforループが削除された理由を完全に理解できました。 – Alexander

答えて

1

あなたのコードは、配列内の3文字の単語の数をカウントされません。それは、配列の最後にある3文字の単語の数を数えています。サンプル入力配列には0が返されます。

C-スタイルためのループは非常に複雑であり、最終的にフォールバックソリューションを whileループにそれを翻訳することです。ループのCスタイルは機械的に等価なものに変換することができます。ループです。つまり、何をしているのか完全に理解していなくても実行できます。

ループのためのこの

for initialization; condition; increment { 
    // body 
} 

は同等です:

initialization 
while condition { 
    // body 
    increment 
} 

だから、あなたのコードは同等です:ここでは

let array = ["hello", "world", nil, "foo", nil, "bar", "Peter Griffin"] 
var threeLetterWords = 0 

var i = array.count - 1 
while i >= 0 && array[i]?.characters.count == 3 { 
    i -= 1 
    threeLetterWords += 1 
} 
print("Found words: \(threeLetterWords)") // says `Found words: 0` 

どのようにありますここでは誰もが非常に不必要にこれを複雑にされ

let array = ["hello", "world", nil, "foo", nil, "bar", "Peter Griffin"] 
var num3LetterWords = 0 

for word in array.reversed() { 
    guard word?.characters.count == 3 else { break } 
    num3LetterWords += 1 
} 

print(num3LetterWords) 
2
//for var i = array.count-1; i >= 0 && array[i].characters.count == 3; --i, ++threeLetterWords { } 

for i in stride(from: (array.count-1), through: 0, by: -1) { 
    threeLetterWords += 1 

    if (array[i]?.characters.count == 3) { 
     break 
    } 
} 
1

あなたは数えるあなたの配列インデックスを逆に使用して文字にwhere句を追加することができます。

let array = ["hello", "world", nil, "foo", nil, "bar", "Peter Griffin"] 
var threeLetterWords = 0 

for index in array.indices.reversed() where array[index]?.characters.count == 3 { 
    threeLetterWords += 1 
} 

print("Found words: \(threeLetterWords)") // should say `Found words: 2` 
0

ためのループとコードの同等のものを行うにはガードを使用しています。

let words = ["hello", "world", nil, "foo", nil, "bar", "Peter Griffin"] 

var num3LetterWords = 0 

for word in words.reversed() { 
    if (word?.characters.count == 3) { num3LetterWords += 1 } 
} 

print(num3LetterWords) 
+0

これは不必要に複雑な 'print(words.count)'のやり方です。 – vacawama

+0

@vacawama haha​​ha if文でコピーするのを忘れていた、修正済み。 – Alexander

+0

'word?.characters.count == 3'をアンラップする必要があります。これは、3文字の単語を数えますが、実際には配列の最後に3文字の単語の数を数えるOPの元のコードと等価ではありません。 – vacawama