2016-06-28 7 views
12

Questo è il mio codice:parametri Inout a Swift 3

func removeFromString(_ s: inout String, Character c:Character) -> Int { 
    var s1 = s 
    var nRemoved = 0 

    while let ix = s1.characters.index(of: c) { 
     s1.removeSubrange(ix...ix) 
     nRemoved += 1 

    } 
    return nRemoved 
} 

var s2 = "everest" 

let resb = removeFromString(&s2, Character: Character("e")) 

Il mio problema è questo dovrebbe cambiare s2 a "VRST" dopo aver utilizzato il parametro sinout. Ma non sta affatto modificando lo var s2. Che cosa sto sbagliando? O mi aspetto un output sbagliato? Fare aiuto Grazie.

risposta

15

Spostando s in s1 ne viene eseguita una copia poiché String è una struttura e tutte le strutture passano per valore. Quindi alla fine cambi solo s1 e non la stringa passata, s. Basta rimuoverlo:

func removeFromString(_ s: inout String, Character c:Character) -> Int { 
    var nRemoved = 0 

    while let ix = s.characters.index(of: c) { 
     s.removeSubrange(ix...ix) 
     nRemoved += 1 

    } 
    return nRemoved 
} 
+1

Perfetto. Grazie! :) – Dershowitz123

+5

Più semplice: 's.remove (at: ix)'. –