Sie können die UnicodeScalarView der Zeichenfolge mithilfe des Mustervergleichsoperators für Bereiche filtern, einen UnicodeScalar ClosedRange von 0 bis 9 übergeben und eine neue Zeichenfolge mit der resultierenden UnicodeScalarView initialisieren:
extension String {
private static var digits = UnicodeScalar("0")..."9"
var digits: String {
return String(unicodeScalars.filter(String.digits.contains))
}
}
"abc12345".digits
bearbeiten / aktualisieren:
Swift 4.2
extension RangeReplaceableCollection where Self: StringProtocol {
var digits: Self {
return filter(("0"..."9").contains)
}
}
oder als mutierende Methode
extension RangeReplaceableCollection where Self: StringProtocol {
mutating func removeAllNonNumeric() {
removeAll { !("0"..."9" ~= $0) }
}
}
Swift 5.2 • Xcode 11.4 oder höher
In Swift5 können wir eine neue Character-Eigenschaft namens verwenden isWholeNumber
:
extension RangeReplaceableCollection where Self: StringProtocol {
var digits: Self { filter(\.isWholeNumber) }
}
extension RangeReplaceableCollection where Self: StringProtocol {
mutating func removeAllNonNumeric() {
removeAll { !$0.isWholeNumber }
}
}
Um auch einen Punkt zuzulassen, können wir Character erweitern und eine berechnete Eigenschaft erstellen:
extension Character {
var isDecimalOrPeriod: Bool { "0"..."9" ~= self || self == "." }
}
extension RangeReplaceableCollection where Self: StringProtocol {
var digitsAndPeriods: Self { filter(\.isDecimalOrPeriod) }
}
Spielplatztests:
"abc12345".digits
var str = "123abc0"
str.removeAllNonNumeric()
print(str)
"Testing0123456789.".digitsAndPeriods
inverted
den Zeichensatz im Swift 3-Beispiel bearbeiten müssen?