2016-03-14 23 views

cevap

6

Geleneksel

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

fonksiyonel alternatif

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

enumerate elemanlarının bir dizi alır ve her bir demet, bir göstergesi dizi çifti olduğu dizilerini içeren bir dizi döner (örneğin (.0 3, .1 "d")) . Daha sonra modulus operatörünü kullanarak garip olan elemanları çıkarırız. Son olarak, map'u kullanarak tuple dizisini normal bir diziye dönüştürürüz.

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

Veya daha da işlevsel bir çözüm için: Kızgın

+1

Teşekkürler! Enumerate'ı öğrendim(). –

12

yerine (Swift yaklaşan bir sürümünde kaldırılacaktır ayarlandığı) için-döngüler C-stili kullanmak yerine, bu kullanarak atılımlar başarabileceğinizi ,

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

Bunu yapmanın farklı şekillerde bir demet, ama burada buldum bir çift ilginç:

flatMap() o kullanılması n indices:

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

Not: [String] aksi derleyici kullanmak flatMap() hangi sürümünü bilmez olarakresult tanımlamak gerekir.

Veya, yerinde orijinal diziyi değiştirmek istiyorsanız:

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

onlar ters sırada sayılan konum böylece ilk indices üzerinde reverse() aramak zorunda Bu durumda. Aksi takdirde dizinin sonuna geldiğinizde artık olmayan bir endeksi kaldırmaya çalışacaksınız.

+0

Not, dizindeki tüm dizin boyunca çıkarılırken, dizinde kaldırılması gerçekten pahalıdır. – Alexander

İlgili konular