範囲のパターンマッチング演算子を使用して文字列のUnicodeScalarViewをフィルタリングし、0から9までのUnicodeScalar ClosedRangeを渡して、結果のUnicodeScalarViewで新しい文字列を初期化できます。
extension String {
private static var digits = UnicodeScalar("0")..."9"
var digits: String {
return String(unicodeScalars.filter(String.digits.contains))
}
}
"abc12345".digits
編集/更新:
Swift 4.2
extension RangeReplaceableCollection where Self: StringProtocol {
var digits: Self {
return filter(("0"..."9").contains)
}
}
または突然変異法として
extension RangeReplaceableCollection where Self: StringProtocol {
mutating func removeAllNonNumeric() {
removeAll { !("0"..."9" ~= $0) }
}
}
Swift5.2•Xcode11.4以降
Swift5では、次のような新しいCharacterプロパティを使用できますisWholeNumber
。
extension RangeReplaceableCollection where Self: StringProtocol {
var digits: Self { filter(\.isWholeNumber) }
}
extension RangeReplaceableCollection where Self: StringProtocol {
mutating func removeAllNonNumeric() {
removeAll { !$0.isWholeNumber }
}
}
ピリオドも許可するために、Characterを拡張して、計算されたプロパティを作成できます。
extension Character {
var isDecimalOrPeriod: Bool { "0"..."9" ~= self || self == "." }
}
extension RangeReplaceableCollection where Self: StringProtocol {
var digitsAndPeriods: Self { filter(\.isDecimalOrPeriod) }
}
遊び場のテスト:
"abc12345".digits
var str = "123abc0"
str.removeAllNonNumeric()
print(str)
"Testing0123456789.".digitsAndPeriods
inverted
Swift 3の例の文字セットで行う必要がある理由を説明できますか?