swift: jak mogę usunąć konkretną postać?


ciąg, taki jak ! !! yuahl! ! chcę usunąć
!
i
, kiedy koduję w ten sposób 
for index in InputName.characters.indices {
if String(InputName[index]) == "" || InputName.substringToIndex(index) == "!" {
InputName.removeAtIndex(index)
}
}

pojawia się taki błąd „błąd krytyczny: indeks: zakres podrzędny rozszerza się poza koniec ciągu”, jak mam to zrobić? THX: D
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Swift 3+

let myString = "aaaaaaaabbbb"
let replaced = myString.replacingOccurrences(of: "bbbb", with: "")// "aaaaaaaa"
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Uważam, że metoda
filter
to dobry sposób na takie rzeczy:
let unfiltered = "! !! yuahl! !"// Array of Characters to remove
let removal: [Character] = ["!"," "]// turn the string into an Array
let unfilteredCharacters = unfiltered.characters// return an Array without the removal Characters
let filteredCharacters = unfilteredCharacters.filter { !removal.contains($0) }// build a String with the filtered Array
let filtered = String(filteredCharacters)print(filtered)// => "yeah"// combined to a single line
print(String(unfiltered.characters.filter { !removal.contains($0) }))// => "yuahl"
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli potrzebujesz tylko usunąć znaki z obu końców, możesz użyć
stringByTrimmingCharactersInSet (_ :)
let delCharSet = NSCharacterSet(charactersInString: "! ")let s1 = "! aString! !"
let s1Del = s1.stringByTrimmingCharactersInSet(delCharSet)
print(s1Del)//->aStringlet s2 = "! anotherString !! aString! !"
let s2Del = s2.stringByTrimmingCharactersInSet(delCharSet)
print(s2Del)//->anotherString !! aString

Jeśli chcesz usunąć również znaki w środku, „rekonstrukcja z przefiltrowanego wyjścia” jest nieco bardziej wydajna niż ponowne usunięcie jednego znaku.
var tempUSView = String.UnicodeScalarView()
tempUSView.appendContentsOf(s2.unicodeScalars.lazy.filter{!delCharSet.longCharacterIsMember($0.value)})
let s2DelAll = String(tempUSView)
print(s2DelAll)//->anotherStringaString

Jeśli nie masz nic przeciwko generowaniu wielu pośrednich ciągów i tablic, ta pojedyncza linijka może wygenerować oczekiwany wynik:
let s2DelAll2 = s2.componentsSeparatedByCharactersInSet(delCharSet).joinWithSeparator("")
print(s2DelAll2)//->anotherStringaString
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Swift 3

W Swift 3 składnia jest nieco lepsza. W wyniku wielkiego przyspieszenia starych interfejsów API metoda fabryczna nosi teraz nazwę
trimmingCharacters (in :)
. Alternatywnie możesz zbudować
CharacterSet
jako
Set
z jednoznakowego
String
s:
let string = "! !! yuahl! !"
string.trimmingCharacters(in: [" ", "!"])// "yuahl"

Jeśli masz znaki w środku ciągu, który również chcesz usunąć, możesz użyć komponentów
(SeparatedBy :). Joined ()
:
let string = "! !! yu !ahl! !"
string.components(separatedBy: ["!", " "]).joined()// "yuahl"

H/T @OOPer dla wersji Swift 2
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

func trimLast(character chars: Set<Character>) -> String {

let str: String = String(self.reversed()) guard let index = str.index(where: {!chars.contains($0)}) else {
return self
}
return String((str[index..<str.endIndex]).reversed())
}
Uwaga:
Dodając tę ​​funkcję do rozszerzenia
String
, możesz ostatecznie usunąć określony znak z ciągu.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz również dodać to bardzo przydatne rozszerzenie:
import Foundation
extension String{
func exclude(find:String) -> String {
return stringByReplacingOccurrencesOfString(find, withString: "", options: .CaseInsensitiveSearch, range: nil)
}
func replaceAll(find:String, with:String) -> String {
return stringByReplacingOccurrencesOfString(find, withString: with, options: .CaseInsensitiveSearch, range: nil)
}
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

for index in InputName.characters.indices.reversed() {
if String(InputName[index]) == "" || InputName.substringToIndex(index) == "!" {
InputName.removeAtIndex(index)
}
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

możesz użyć tego:
na przykład jeśli chcesz usunąć procent „%” z 10%
if let i = text.firstIndex(of: "%") {
text.remove(at: i)//10
}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się