2016-03-24 21 views
4

Gelecekte, C-style for statements will be removed from Swift. stride veya ..< operatörünün kullanılması gibi deyimler için C stilini kullanmanın birçok alternatif yöntemi olsa da, bunlar yalnızca bazı koşullarda çalışır.Deyimler için String.CharacterView.Index.successor() öğesini kullanma

Örneğin, eski sürümlerinde, geçiş yapmak mümkün oldu. ifadeleri Ancak bu artık önerilmemektedir

for var index = string.startIndex; index < string.endIndex; index = string.successor().successor(){ 
    //code 
} 

C-stilini kullanarak bir dize ait String.CharacterView.Index endekslerinin her diğeri. Orada bir while döngü

var index = string.startIndex 
while index < string.endIndex{ 
    //code 

    index = index.successor().successor() 
} 

kullanarak aynı şeyi yapmak için bir yol, ama geçici bir çözüm çok daha fazla değildir. dize

for index in string.startIndex..<string.endIndex 

her indeksi döngü için mükemmel olurdu Ancak bu dizenin her diğer indeksi veya dize her n indeksi döngü ile yardımcı olmuyor ..< operatör vardır

while döngüsünden başka bir String'in diğer tüm dizinlerinden döngü oluşturmanın başka "hızlı" yolu var mı? Bu soru yalnızca dize dizinleriyle ilgili değil, yalnızcagibi genel olarak stride ve ..< çalışmayan nesnelerin çalıştığı nesnelerdir.

+0

o döngü örneğin 'in' endeksi = index.successor() halefi() değil midir? – vadian

+0

@vadian evet, ve bu yöntem şu anda çalışıyor, ancak kullanımdan kaldırıldı ve Swift – Jojodmo

+3

'un gelecekteki bir sürümünde kaldırılıyor Bir karakter görünümü oluşturmanın ilginç bir tartışması: http://stackoverflow.com/questions/36205309/conforming-string -characterview-index-to-strideable-fatal-error-kullanırken-stri- – matt

cevap

2

kullanabilirsiniz Sulthan notlarına dayanarak,

let str = "abcdefgh" 
for i in str.characters.indices where str.startIndex.distanceTo(i) % 2 == 0 { 
    print(i,str.characters[i]) 
} 

baskılar

0 a 
2 c 
4 e 
6 g 

GÜNCELLEME 'adım'

for (i,v) in str.characters.enumerate() where i % 2 == 0 { 
    print(i, v) 
} 
+1

Bu çözüm ile ilgili sorun 'distanceTo' karmaşıklığıdır. Tamsayı dizini için 'uzaklık' basit bir çıkarmadır, ancak' string' indisleri için distanceTo' lineer karmaşıklığa sahiptir. – Sulthan

+0

@Sulthan katılıyorum. Ancak, enumerate kullanarak aynı sorun var – user3441734

+0

@Sulthan çözüm [Karakter] ilk – user3441734

4

fonksiyonel programlama ile yapalım:

let text = "abcdefgh" 

text.characters 
    .enumerate() // let's get integer index for every character 
    .filter { (index, element) in index % 2 == 0 } // let's filter out every second character 
    .forEach { print($0, $1) } // print 

Sonuç:.

0 a 
2 c 
4 e 
6 g 
+1

Bu çok uzun dizeler için acı çekecek mi? Sanırım 'sayım' tembel, bu yüzden iyi olmalısın. Eğer değilse, 'characters.lazy' diyebilirsiniz. – matt

+0

Teşekkürler! Bu cevap gerçekten yardımcı oldu, ancak koduma [bu yöntem] (http://stackoverflow.com/a/36194406/2767207) kullanarak son verdim – Jojodmo

İlgili konular