범위에 대해 패턴 일치 연산자를 사용하여 문자열의 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
편집 / 업데이트 :
스위프트 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) }
}
}
Swift 5.2 • Xcode 11.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 예제에서 문자 집합 을 처리해야하는 이유를 설명해 주 시겠습니까?