2015-09-01 27 views
5

Sto cercando un modo semplice per rimuovere i 4 caratteri nelle tilesColored String "ment" da shuffledWord1.Come rimuovere caratteri da una stringa in swift

var word1: String = "employment" 
var shuffledWord1: String = "melpyoemtn" 

var tilesColored: String = "ment" 
var characters = Array(tilesColored) // gives ["m","e","n","t"] 

let newWord1 = word1.StringByReplacingOccurencesOfString("\(characters[0])", withString:"") // gives "elpyoetn" 

stringByReplacingOccurencesOfString consente solo 1 personaggio da controllare e rimuove ENTRAMBI m di, quindi come posso controllare contro tutti 4 e rimuovere una sola istanza di ogni tornare "melpyo"?

Grazie in anticipo per qualsiasi aiuto possibile

+0

Si sta tentando di rimuovere gli ultimi 4 caratteri o si sta tentando di rimuovere un'istanza di m, e, n e t, ma non in un ordine particolare? – keithbhunter

+0

hi keith. Sto provando a rimuovere l'istanza delle tessere colorate m, e, n, t – richc

risposta

-1

Così si desidera sostituire ogni personaggio una sola volta, a partire dal lato destro? Prova questo (Swift 2.0):

var word1: String = "employment" 
var shuffledWord1: String = "melpyoemtn" 

var tilesColored: String = "ment" 
var searchOption : NSStringCompareOptions = .BackwardsSearch 

for c in tilesColored.characters { 
    if let range = shuffledWord1.rangeOfString(String(c), options: searchOption) { 
     shuffledWord1 = shuffledWord1.stringByReplacingCharactersInRange(range, withString: "") 
    } 
} 

print(shuffledWord1) // melpyo 

Rimuovere il .characters se si utilizza Swift 1.2

+0

hi Dino, la ShuffledWord1 può essere completamente casuale, quindi una ricerca all'indietro non coprirà tutti i casi. – richc

+0

@richc Non capisco quello che vuoi. Ci sono 2 'm' e 2' e'. Come decidi quale rimuovere? –

+0

@Dino - Mi rendo conto ora che senza conoscere l'indice mescolato che corrisponde al personaggio mescolato è impossibile. Quindi la tua risposta è il più vicino che ho intenzione di ottenere. Grazie per aver pensato a questo! – richc

0

Swift 2.0:

extension String { 
    func stringByRemovingOnce(chars: String) -> String { 
    var cs = Set(chars.characters) 
    let fd = characters.filter { c in 
     cs.remove(c).map { _ in false } ?? true 
    } 
    return String(fd) 
    } 
} 

"melpyoemtn".stringByRemovingOnce("ment") // "lpyoem" 

Swift 1.2:

extension String { 
    func stringByRemovingOnce(chars: String) -> String { 
    var cs = Set(chars) 
    let fd = filter(self) { c in 
     cs.remove(c).map { _ in false } ?? true 
    } 
    return String(fd) 
    } 
} 

"melpyoemtn".stringByRemovingOnce("ment") // "lpyoem" 
1
extension String 
{ 
    func removeCharacters(characters: String) -> String 
    { 
     let characterSet = NSCharacterSet(charactersInString: characters) 
     let components = self.componentsSeparatedByCharactersInSet(characterSet) 
     let result = components.joinWithSeparator("") 
     return result 
    } 
} 
0

Versione Swift 3 di Macond La risposta di o2Seattle, che, penso, è la soluzione più elegante.

extension String { 
    func removing(charactersOf string: String) -> String { 
     let characterSet = CharacterSet(charactersIn: string) 
     let components = self.components(separatedBy: characterSet) 
     return components.joined(separator: "") 
    } 
} 
6

Versione Swift 3 con prestazioni migliori rispetto alle precedenti risposte. (Perché non separiamo gli array con sottostringhe, che richiederebbero allocazioni separate.)

Questo qui funziona solo sul livello scalare Unicode. Puoi incollarlo direttamente in un parco giochi.

import Foundation 

extension String { 

    func removeCharacters(from forbiddenChars: CharacterSet) -> String { 
     let passed = self.unicodeScalars.filter { !forbiddenChars.contains($0) } 
     return String(String.UnicodeScalarView(passed)) 
    } 

    func removeCharacters(from: String) -> String { 
     return removeCharacters(from: CharacterSet(charactersIn: from)) 
    } 
} 

let str = "n1o d2i3g4i5t6s!!!789" 

let t1 = str.removeCharacters(from: CharacterSet.decimalDigits.inverted) 
print(t1) // will print: 123456789 

let t2 = str.removeCharacters(from: "") 
print(t2) // will print: no digits!!! 
+0

Funziona perfettamente – Jeremy

Problemi correlati