2016-03-14 2 views
5

だから私は、アレイ持っていると言う:どのように私はから "A"、 "C"、 "E"、 "G"、および "I"(すべての偶数のインデックスを削除するか、今Swiftの配列内の他のすべての要素を削除するには?

var stringArray = ["a","b","c","d","e","f","g","h","i","j"] 

をアレイ)?

ありがとうございます!

答えて

6

伝統

var filteredArray = [] 
for var i = 1; i < stringArray.count; i = i + 2 { 
    filteredArray.append(stringArray[i]) 
} 

機能代替

var result = stringArray.enumerate().filter({ index, _ in 
    index % 2 != 0 
}).map { $0.1 } 

enumerate要素のアレイを取得し、各タプルは、索引配列対(例えば(.0 3, .1 "d"))であるタプルの配列を返します。モジュラス演算子を使用して奇数の要素を削除します。最後に、タプル配列をmapを使って通常の配列に戻します。 HTH

+1

ありがとうございます!私はenumerate()を学んだ。 –

12

代わりに(スウィフトの次期バージョンで廃止されるように設定されている)、ループのためにC-スタイルを使用して、あなたは、この使用して進歩を達成できます。

var result = [String]() 
for i in 1.stride(to: stringArray.count, by: 2) { 
    result.append(stringArray[i]) 
} 

またはそれ以上の機能ソリューションのために

flatMap() Oを使用して:、

let result = 1.stride(to: stringArray.count, by: 2).map { stringArray[$0] } 
2

私は面白い発見がいくつかあり、これを達成するためにさまざまな方法の束がありますが、ここにありますN indices

let result: [String] = stringArray.indices.flatMap { 
    if $0 % 2 != 0 { return stringArray[$0] } 
    else { return nil } 
} 

注:[String]のように定義することがresultニーズそうでない場合、コンパイラはflatMap()のどのバージョンを使用することを知りません。

それとも、あなたが代わりに元の配列変更する場合:この場合

stringArray.indices.reverse().forEach { 
    if $0 % 2 == 0 { stringArray.removeAtIndex($0) } 
} 

を、あなたはそれらが逆の順序で列挙されているように、最初indicesreverse()を呼び出す必要があります。さもなければ配列の終わりに達する頃にはもう存在しないインデックスを削除しようとします。

+0

このように配列全体を削除すると、インデックスの削除は本当に高価です。 – Alexander

関連する問題